答案校验是正确的,但只显示通过5/6组案例
let arr = [];
while ((line = readline())) {
arr.push(line.split(" ").map(Number));
}
let ans = run(arr);
for (let i = 0; i < 9; i++) {
console.log(ans[i].join(" "));
}
function run(arr) {
//创建数据备份,进行深度递归
let tempArr = new Array(arr.length)
.fill(0)
.map((v) => new Array(arr.length).fill(0));
//引用数据类型的深拷贝,防止对母数据的修改
for (let i = 0; i < 9; i++) {
for (let j = 0; j < 9; j++) {
tempArr[i][j] = arr[i][j];
}
}
for (let i = 0; i < 9; i++) {
for (let j = 0; j < 9; j++) {
if (tempArr[i][j] == 0) {
//检查当前位置可用于替换的元素数组
let temp = check(tempArr, i, j);
if (temp.length == 0) {
return;
} else {
while (temp.length) {
//这里可以改成pop():依据出栈顺序,能通过的案例也有所变化
tempArr[i][j] = temp.shift();
if (i == 8 && j == 8) {
return tempArr;
}
//递归新数组,最后一层有结果则返回
let res = run(tempArr);
if (res) {
//可以看成是出口的上一层,最终返回结果的链式传递
return res;
}
}
//while遍历结束都没有找到合适的替换元素,则退出当前函数
return;
}
}
}
}
//递归出口
return tempArr;
}
function check(arr, x, y) {
let temp = [];
let a = Math.floor(x / 3) * 3;
let b = Math.floor(y / 3) * 3;
//检查九宫格
for (let i = a; i < a + 2; i++) {
for (let j = b; j < b + 2; j++) {
if (arr[(i, j)] != 0) {
temp.push(arr[i][j]);
}
}
}
//检查同一行和同一列
for (let i = 0; i <= 8; i++) {
if (arr[x][i] != 0) {
temp.push(arr[x][i]);
}
if (arr[i][y] != 0) {
temp.push(arr[i][y]);
}
}
//手动去重
temp.filter((item, index, array) => {
return index == array.indexOf(item);
});
let res = [];
for (let i = 1; i <= 9; i++) {
if (!temp.includes(i)) {
res.push(i);
}
}
return res;
}