深度优先搜索小总结

下定义

DFS指:从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最终的解。

写DFS函数的关键

1.考虑选择什么样的状态;

2.弄清第i个状态(即每一个状态)要干什么。

技巧

画搜索树

题目分类

一.对于状态少,但每个状态的情况极多的题目:

用dfs代替n重循环。如:(9条消息) DFS代替n重循环---洛谷P1149 火柴棒等式_IOv0id的博客-优快云博客

二.对于有明显起点的题目,可以联想图的形式进行DFS;

三.对于起点不明显的题目,可以将题目中的状态分步或者说分类,以实现不同分支继续进行DFS;

这种状态需要自行判断找出,一般要找状态数目少的,这样的话,每一次dfs中函数调用的次数就少。比如洛谷P3392 涂国旗P3392 涂国旗 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn),

题目要求一个坐标系中每一行涂一种颜色,共给出三种颜色,且三种颜色顺序必须是白,蓝,红;该题的状态可以是

1.判断每一行可以涂多少种颜色(如果看成是涂数字,也可以用dfs代替n重循环解决问题)

2.前i行涂白色,再涂j行蓝色,剩余的行涂红色。初始值i,j可以均设置为1,以i,j为dfs参数,每次调用时i+1或j+1.

显然第二种状态只用两步调用,而第一种状态需要用多个条件语句调用很多次。

所以该题选择第二种分步更合适.

四.当需要回溯时

先分步调用函数.

在每一步(即每次调用)前就要完成这一步需要执行的动作;

在这一步结束后,再完成下一步需要执行的动作,而这个动作就包括撤回之前一步的动作。

例题:洛谷P1157 组合的输出(9条消息) 洛谷P1157 组合的输出_IOv0id的博客-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值