回溯法,我理解应该也可以叫做深度优先搜索(Depth-First Search)。所以,他是一种搜索算法。
既然谈到搜索,往往这里面会面临选择的情景。以那个青蛙为例,当面对第一个台阶时,他有两个选择。当他选择一种选择后,将“义无反顾”的一条道走下去,每层都会进行一次选择,直到走到地n层位置时。这时,青蛙已经触碰到了边界,并得到了一种方案,之后青蛙会返回到最近的上一次选择时的情景,选择第二种情况继续走下去。以此往复,直到搜索全部的情景。
是的,这非常的抽象。我们来看看用二叉树来描述运动轨迹是怎么样的。我们假设 n = 3。
颜色
- 蓝色 代表当前搜索路走过的路径节点
- 白色 代表没有搜索走过的节点
- 红色 代表已经搜索过的节点,不可以再走
左右子树
- 左子树 代表走一步
- 右子树 代表走两步
回溯
如下图中红框标记的位置就是回溯到某一个情况。
如果你理解了下图的运动轨迹,我想差不多对于回溯的搜索过程就基本了解了。所以,你可以找到其他回溯点么?
![9ee6aaa8294925f65dbf3e1614433119.png](https://i-blog.csdnimg.cn/blog_migrate/c4eb7bd24a4ea040652687203cb51dcd.jpeg)
理解了上图的运动轨迹后,那么,代码是什么样子呢?
#include using namespace std; /** * int count 方案总数 * int target 目标—— 剩余的台阶数 */ void dfs(int& count, int target) { // 边界条件 if (target < = 2) { count += target; // 当剩余一个台阶是即累加一种方案,剩余两个台阶时累加两种方案 return; } // 下面是两个基本点选择一步和选择两步 // 选择一步 dfs(count, target - 1); // 选择两步 dfs(count, target - 2); } int main() { int count = 0; dfs(count, 4); cout<
边界条件
剩余一个台阶时,累加一种方案剩余两个台阶时,累加两种方案
###再说更重要的选择的两个基本点
选择走一步选择走两步
以此进行递归搜索(深度优先搜索 DFS),在搜索到边界时进行回溯,以此往复直到搜索到所有情况为止。