【发布时间】:2020-06-10 17:38:06
【问题描述】:
我尝试使用 Javascript 构建数独求解器。该代码确实解决了它,但仍然存在一些空白点。 我使用 Javascript、回溯和递归。
在第一个函数中,我检查一个空白点 (0) 上的数字是可能的,在第二个函数中,我调用第一个函数来检查空白点并尝试在该点放置一个介于 1 和 9 之间的数字
p>谁能看出我做错了什么?
const userInput = [
[5, 3, 0, 0, 7, 0, 0, 0, 0],
[6, 0, 0, 1, 9, 5, 0, 0, 0],
[0, 9, 8, 0, 0, 0, 0, 6, 0],
[8, 0, 0, 0, 6, 0, 0, 0, 3],
[4, 0, 0, 8, 0, 3, 0, 0, 1],
[7, 0, 0, 0, 2, 0, 0, 0, 6],
[0, 6, 0, 0, 0, 0, 2, 8, 0],
[0, 0, 0, 4, 1, 9, 0, 0, 5],
[0, 0, 0, 0, 8, 0, 0, 7, 9],
];
function possible(y, x, n) {
for (let i = 0; i <= 8; i++) {
if (userInput[y][i] === n) {
return false;
}
}
for (let i = 0; i <= 8; i++) {
if (userInput[i][x] === n) {
return false;
}
}
let xSquare = Math.floor(x / 3) * 3;
let ySquare = Math.floor(y / 3) * 3;
for (let i = 0; i <= 2; i++) {
for (let j = 0; j <= 2; j++) {
if (userInput[ySquare + i][xSquare + j] === n) {
return false;
}
}
}
return true;
}
function solve() {
for (let y = 0; y <= 8; y++) {
for (let x = 0; x <= 8; x++) {
if (userInput[y][x] === 0) {
for (let n = 1; n <= 9; n++) {
if (possible(y, x, n)) {
userInput[y][x] = n;
solve();
}
}
}
}
}
}
【问题讨论】:
-
为什么
solve在最里面的 if 中调用自己,而不是前进到下一个 x? -
这似乎遗漏了非常重要的逻辑。对于这种类型的解决方案,您确实需要能够在遇到死胡同时回溯。您还需要一些方法来检查您是否已完成拼图。
标签: javascript recursion backtracking sudoku