37. 解数独
题目描述
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
- 数字
1-9在每一行只能出现一次。 - 数字
1-9在每一列只能出现一次。 - 数字
1-9在每一个以粗实线分隔的3x3宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。
示例 1:
输入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]] 输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]] 解释:输入的数独如上图所示,唯一有效的解决方案如下所示:![]()
提示:
board.length == 9board[i].length == 9board[i][j]是一位数字或者'.'- 题目数据 保证 输入数独仅有一个解
解法
方法一:回溯
思考
空格最多八十余个,每个有 \(9\) 种填法,直接枚举全部填法不可行。必须在违反行、列、宫约束时立即停止。
与「有效的数独」相同,反复扫描棋盘以检查某数字是否已用,代价较高。我们可以先将已填数字记入 \(row\)、\(col\)、\(block\),再只对空格列表 \(t\) 做搜索。
\(dfs(k)\) 处理第 \(k\) 个空格,枚举尚未占用的 \(v\),写入后递归;找到解后用 \(ok\) 截断,不再继续换数。回溯时恢复占用标记,成功路径上棋盘中的数字予以保留。
我们用数组 \(\textit{row}\), \(\textit{col}\), \(\textit{box}\) 分别记录每一行、每一列、每个 3x3 宫格中数字是否出现过。如果数字 \(i\) 在第 \(r\) 行、第 \(c\) 列、第 \(b\) 个 3x3 宫格中出现过,那么 \(\text{row[r][i]}\), \(\text{col[c][i]}\), \(\text{box[b][i]}\) 都为 \(true\)。
我们遍历 \(\textit{board}\) 中的每一个空格,枚举它可以填入的数字 \(v\),如果 \(v\) 在当前行、当前列、当前 3x3 宫格中没有出现过,那么我们就可以尝试填入数字 \(v\),并继续搜索下一个空格。如果搜索到最后,所有空格填充完毕,那么就说明找到了一个可行解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | |
