37. 解数独¶
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
- 数字
1-9在每一行只能出现一次。 - 数字
1-9在每一列只能出现一次。 - 数字
1-9在每一个以粗实线分隔的3x3宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。
示例 1:
提示:
board.length == 9board[i].length == 9board[i][j]是一位数字或者'.'- 题目数据 保证 输入数独仅有一个解
个人题解¶
我有必要解释一下递归过程,首先把 9x9 大格子拆分为两个 for 循环,外层循环遍历行,内层循环遍历列。这样就分解为 81 个常规的 backtracking 模板。
| C++ | |
|---|---|
这里的 backtracking 解决的是这样一个过程:
从 1-9 依次选数,如果合理,那就填入这个数,在当前位置填入该数字的基础上,然后开始递归。递归过程就是重复遍历这个 9x9 大格子中其它未填数字的区域,直到所有 backtracking 返回 true 这代表找到了答案。如果在某个 backtracking 中,9 个数字都不满足,代表该递归上一层所填的数字不合理,返回 false 后,上一层的 backtracking 会将之前填写的数字清除掉 board[i][j] = '.',继续进入下一次 for(char val = '1'; val <= '9'; val++) 尝试下一个数字。
