深度优先搜索——回溯

在之前的搜索没居中,我们并没有考虑选入的物品的排列顺序,但在一些题目中,会要求考虑给定数字或物品的排列,这种排列可以是在n个中符合要求的全排列,也可以是在n中找到长度为k的排列。
如果使用我们之前的搜索方法,我们会发现难以用参数标记原数组中的数字选取情况,那么我们就需要一个全局的布尔数组,帮助我们标记哪些数字已经被选入了排列。另一方面,由于我们使用了这样的去安居标记数组,那么必须要用到回溯技巧,在这个分支搜索结束后,将标记数组还原
若要输出 n 个数字全排列,在 dfs 数组中需要的参数需要包含已经选入的数字,在选取当前位数字后进行搜索后,要注意进行回溯
dep表示枚举到第dep为,如果放入后再判断数字是否被用过就太慢了,所以可以在放入前就先判断,如果没有用过,那么当前这个数在标记数组里就应该改为true(用过),当前数组当前这位是这个数字,然后枚举到下一位,最后要回溯,即标记数组这个数字改回false(没用过),由于一直在从小往大找数字,所以最后得到i的结果也一定是字典序

代码示例:

#include <iostream>
using namespace std;
const int N = 20;
int n;
int per[N];
bool vis[N];
void dfs (int dep) {
   
    if(dep==n)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值