1 回答
TA贡献1851条经验 获得超4个赞
您正在编写回溯算法,但这里没有回溯。当前的算法假设每个猜测的值都是完美的 - 如果有任何不完美(这是可以保证的,因为值是从1到9的顺序猜测的),则无法取得进展。
要回溯,您需要将无法扩展为已解决状态的单元格清零,并在单元格的所有可能性耗尽时将 false 返回到父状态。
此外,函数最好采用参数并返回值,而不是改变全局状态。
应用这些最小的修改将产生以下结果。还有改进的余地。例如,该函数必须重复“搜索”下一个打开的正方形。solve
function possible(board, y, x, n) {
for (let i = 0; i < 9; i++) {
if (board[y][i] === n || board[i][x] === n) {
return false;
}
}
const xSquare = Math.floor(x / 3) * 3;
const ySquare = Math.floor(y / 3) * 3;
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (board[ySquare+i][xSquare+j] === n) {
return false;
}
}
}
return true;
}
function solve(board) {
for (let y = 0; y < 9; y++) {
for (let x = 0; x < 9; x++) {
if (board[y][x] === 0) {
for (let n = 1; n <= 9; n++) {
if (possible(board, y, x, n)) {
board[y][x] = n;
if (solve(board)) return board;
}
}
board[y][x] = 0;
return false;
}
}
}
return board;
}
const puzzle = [
[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],
];
console.log(solve(puzzle).map(e => "" + e));
添加回答
举报