37. 解数独¶
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.'
表示。
示例 1:
提示:
board.length == 9
board[i].length == 9
board[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++)
尝试下一个数字。