037-解数独
原题:解数独
思路:递归、回溯
思路
一看到这种组合+查重的问题,咱们就应该能想到用 递归、回溯 + 哈希表
1. 确认方格中的值是否合法
在行中值唯一
1
2
3for (let i = 0; i < 9; i++) {
if (board[y][i] === value) return false;
}在列中值唯一
1
2
3for (let i = 0; i < 9; i++) {
if (board[i][x] === value) return false;
}在当前 3x3 区块中值唯一
1
2
3
4
5
6
7const startY = Math.floor(y / 3) * 3;
const startX = Math.floor(x / 3) * 3;
for (let i = startY; i < startY + 3; i++) {
for (let j = startX; j < startX + 3; j++) {
if (board[i][j] === value) return false;
}
}
最终实现:
1 | /** |
2. 遍历每一个方格
1 | for (let y = 0; y < 9; y++) { |
如果已有值,进入下一次循环
1
if (board[y][x] !== '.') continue;
遍历字符串
"1" ~ "9"
1
2
3for (let v = 1; v <= 9; v++) {
...
}如果当前值在该方格合法
1
2
3
4
5
6
7
8const value = v.toString();
if (checkValue(board, x, y, value)) {
board[y][x] = value;
// 以当前棋盘递归,如果当前值后面的组合成功了,返回 true
if (search(board)) return true;
// 否则回溯当前修改,循环尝试下一个值的组合
board[y][x] = '.';
}
如果
"1" ~ "9"
中没有符合条件的,当前棋盘无解,返回 false1
2
3
4for (let v = 1; v <= 9; v++) {
...
}
return false;
如果走完,说明每个格子都有已合法的值,返回 true
1 | return true; |
完整代码
1 | /** |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 乱炖锅!
评论