我理解的回溯法,简单来说,就是遍历,就是DFS!
其它的都是想想都知道的:谁不知道碰到走不下去的就回去,谁不知道碰到走不下去退回到上一步,而不是退到初始的地方。
基本解决思想
记录之前的操作,这样可以退回到上一步的操作,进而进行下一个candidate的试探。
考虑要点
1. 非法结束
当进入非法的状态的时候,执行怎样的操作,通常在递归的过程中,直接return结束即可,如果有特殊的操作,需要进行特殊的处理。
2. 满足条件
满足条件的情况下,需要进行怎样的操作,比如将正确的值记录下来,返回成功的状态等。
3. 遍历试探
这一步是最重要的一步,也是最繁琐的一步。
需要遍历所有可能的选择,往前“走一步”,在“走了一步”的状态下进行新的一轮操作。操作完成之后,需要“回退一步“到原来的状态。
这个遍历可能出现的情况有:二维地图的上下左右遍历,找数组满足条件的值得遍历数组等。
相关问题
以下问题都能够或多或少体现上述的三个要点。
subset problem
|
|
|
|
N-Queen
|
|
Sudoku
|
|