自用ACM模板之DFS/回溯(循环)

前言:本人是个实力很弱但立志变强的ACM小白(使用C++)。此篇DFS/回溯算法模板目前只有循环实现,等之后学习了队列实现或递归实现会回头补充。

DFS即深度优先搜索,在搜索一个状态下一步变化之后可能产生的状态时,先不断沿每层产生的第一个新状态往下搜索,直到往下再无选择时,回到上一个有其他选择的节点,更换选择继续不断往下搜索(似乎也是回溯算法)

可用树状图表达:

可按序保存搜索路径的模板(循环实现)

用二维数组dfs[][]存储搜索树,每行的第一个数表示当前层的选项数,后面的数则是这一层可选的所有选项,

比如搜索6的素数环, 第一层只能选择1,那么dfs的第一行数据是1,1 第二层可以选择2,4,6,那么第二行数据是3,2,4,6(有3个选择,分别是2,4,6),以此类推,

每一层始终是从上一层最靠左的选择遍历而来,当搜索到往下再无选择时,回溯到上一个选项数>=2的那一层,然后进行“封路”操作:即删除经过了的那个选择(一定是那一层最靠左的那个),其他选择左移一个数组单位,该层的选项数-1。

封路之后,继续从这一行的最靠左的选择往下搜,搜索结果向下覆盖之前的路径(必要的时候在重新开始搜之前先将旧搜索结果清零)

这样当找到搜索目标时,dfs数组的每一行的第二个数就是正确的搜索路径(第一个数是当前层选项数)。

辅助变量:

layer - 总是表示当前层的层数。

direction - 

转载于:https://my.oschina.net/u/4035395/blog/3011508

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值