回溯法的应用-数独游戏
在开始进行回溯法解数独的之前,先来一道热身题,如果辨别是否是一个有效的数独。
数独游戏的规则是:
- 数字1-9在每一行只能出现一次。
- 数字1-9在每一列只能出现一次。
- 数字1-9在每一列以粗实线分隔的3x3宫内只能出现一次
由于题目比较简单,直接上代码
1 | class Solution{ |
有了上面对数独游戏的理解,接下来我们来进行完成解数独。
LeetCode 37、https://leetcode-cn.com/problems/sudoku-solver/
题目的意思非常明确,给我们一个9x9的方格,然后根据已经填充的部分来解决数独问题。
在之前的全排列问题,或者八皇后问题中。我详细介绍了回溯算法的具体思路,其实回溯算法就是一个暴力穷举的过程。而本题就非常适合于暴力穷举,因为我们要枚举所有的数字,只用稍加剪枝即可。
1 | //对board进行穷举 |
但是很明显,我们在作出选择的情况下应该有一个先决条件,即并不是所有的1-9都是可以取到的.
1 | //判断当前位置是否可以摆放 |
到这里,是不是我们还差一个所谓的basecase 即终止条件?
1 | //表示某一列已经摆放完,接着从下一列的第一个元素开始摆放 |
接下来合并所有代码
1 | class Solution { |
总结 :
- 回溯法就是如此的暴力,在我们需要枚举多个变量时,往往使用回溯法。
- 例如八皇后问题,实质上也是一个解数独问题,例如全排列问题,实际上也是对决策树进行遍历的过程。