思路:创建一个9*9的数独数组,挨个往里面插入1-9的数值,并且验证该数值插入是否合理,该数值插入之后是否会导致生成错误数据,最后生成一张随机数独数据
function getShuDu() {
//创建初始数组
let shudu = new Array(9);
for (let i = 0; i < 9; i++) {
shudu[i] = new Array(9).fill(0);
}
//填充数值
function tian(h,s) {
if (h == 9) {
//如果来到这 计算正确
return true;
}
if (s == 9) {
//换行计算
return tian(h + 1, 0);
}
if (shudu[h][s] != 0) {
//如果已经存在 则计算下一个
return tian(h, s+1);
}
var sum = [1, 2, 3, 4, 5, 6, 7, 8, 9];
while (sum.length > 0) {
var num = sum.splice(Math.floor(Math.random() * sum.length), 1)[0]
if (yan(h, s, num)) {
shudu[h][s] = num;
if (tian(h, s + 1)) {
return true;
}
shudu[h][s] = 0;
}
}
return false;
}
//验证填充数值是否正确
function yan(h,s,num) {
// 检查行
for (let i = 0; i < 9; i++) {
if (shudu[h][i] === num) {
return false;
}
}
// 检查列
for (let i = 0; i < 9; i++) {
if (shudu[i][s] === num) {
return false;
}
}
// 检查所在的 3x3 子网格
let startRow = Math.floor(h / 3) * 3;
let startCol = Math.floor(s / 3) * 3;
for (let i = startRow; i < startRow + 3; i++) {
for (let j = startCol; j < startCol + 3; j++) {
if (shudu[i][j] === num) {
return false;
}
}
}
return true;
}
tian(0, 0);
return shudu;
}
标签:return,++,shudu,生成,tian,算法,num,let,数独 From: https://www.cnblogs.com/mufuhu/p/18392713