回溯法基本思想_算法思想之回溯法

回溯法,我理解应该也可以叫做深度优先搜索(Depth-First Search)。所以,他是一种搜索算法。

既然谈到搜索,往往这里面会面临选择的情景。以那个青蛙为例,当面对第一个台阶时,他有两个选择。当他选择一种选择后,将“义无反顾”的一条道走下去,每层都会进行一次选择,直到走到地n层位置时。这时,青蛙已经触碰到了边界,并得到了一种方案,之后青蛙会返回到最近的上一次选择时的情景,选择第二种情况继续走下去。以此往复,直到搜索全部的情景。

是的,这非常的抽象。我们来看看用二叉树来描述运动轨迹是怎么样的。我们假设 n = 3。

颜色

  • 蓝色 代表当前搜索路走过的路径节点
  • 白色 代表没有搜索走过的节点
  • 红色 代表已经搜索过的节点,不可以再走

左右子树

  • 左子树 代表走一步
  • 右子树 代表走两步

回溯

如下图中红框标记的位置就是回溯到某一个情况。

如果你理解了下图的运动轨迹,我想差不多对于回溯的搜索过程就基本了解了。所以,你可以找到其他回溯点么?

9ee6aaa8294925f65dbf3e1614433119.png

理解了上图的运动轨迹后,那么,代码是什么样子呢?

#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),在搜索到边界时进行回溯,以此往复直到搜索到所有情况为止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值