【概述】
深度优先搜索,是从初始状态起,利用一定的规则生成搜索树,寻找下一层任一个结点,检查是否出现目标状态,若未出现,以此状态利用规则生成再下一层任一个结点,再检查,重复过程一直到叶节点(即不能再生成新状态节点),当它仍不是目标状态时,回溯到上一层结果,取另一可能扩展搜索的分支。采用相同办法一直进行下去,直到找到目标状态为止。
状态必须在遍历完所有它的子状态之后,才能继续进行对同一层中下一个状态的遍历。
由于深度优先搜索是利用规则生成搜索树实现的,其符合栈的先进后出的性质,因此当需要搜索最深处的结点时,利用深搜较为适合。
在搜索的过程中,由于搜索的低效无法很好的处理重叠子问题,动态规划虽然较好的处理了重叠子问题但再一些具拓扑关系的题前较无奈,因此可采用记忆化搜索的方法,通过记忆化记录每个状态的搜索结果,在重复遍历一个状态时直接检索并返回。
简单地说就是:记忆化搜索=搜索的形式+动态规划的思想
【具体过程】
- 从当前元素进行拓展
- 若元素无法继续拓展,则将返回上层结点元素,继续 1 过程
- 不断重复,直到获得目标状态即取得可行解时,或者所有结点搜索完毕无解时,结束。
每个方块表示一个状态,浅蓝色的表示遍历了该状态黑色代表当前探索的状态,浅蓝色为已经搜索过的状态,灰色为未搜索的状态。在过程中遇到搜索的解则退出,找到答案。
【实现】
void dfs(答案,搜索层数,其他参数){
if(层数==maxdeep){
更新答案;
return;
}
(剪枝)
for(枚举下一层可能的状态){
更新全局变量表示状态的变量;
dfs(答案+新状态增加的价值,层数+1,其他参数);
还原全局变量表示状态的变量;
}
}
【例题】
- 全排列(信息学奥赛一本通-T1199):点击这里
- 组合的输出(信息学奥赛一本通-T1317):点击这里
- 八皇后(洛谷-P1219):点击这里
- 八皇后问题(信息学奥赛一本通-T1213):点击这里
- 八皇后(信息学奥赛一本通-T1214):点击这里
- 马走日(信息学奥赛一本通-T1219):点击这里
- 放苹果(信息学奥赛一本通-T1222):点击这里
- 滑雪(洛谷-P1434):点击这里
同题:滑雪(信息学奥赛一本通-T1280):点击这里 - 单词接龙(洛谷-P1019):点击这里
同题:单词接龙(信息学奥赛一本通-T1220):点击这里 - 单词方阵(洛谷-P1101):点击这里
- Cow Picnic(POJ-3256):点击这里
- A strange lift(HDU-1548):点击这里
- たくさんの数式 / Many Formulas(AtCoder-2067):点击这里
- 生日蛋糕(信息学奥赛一本通-T1441):点击这里
- Birthday Puzzle(Gym-102267K):点击这里
- 自然数的拆分(信息学奥赛一本通-T1318)(递归输出+dfs):点击这里
- 分成互质组(信息学奥赛一本通-T1221)(GCD+dfs):点击这里
- Sudoku Killer(HDU-1426)(块、行、列的依次判断+dfs):点击这里
- 虫食算(洛谷-P1092)(多情况划分+dfs):点击这里
- Another Eight Puzzle(HDU-2514)(多情况划分+dfs):点击这里
- 蜥蜴与地下室(51Nod-1489)(数据预处理+dfs):点击这里
- Divide by three, multiply by two(CF-977D)(构造+dfs):点击这里
- Prime Ring(HDU-1016)(环形dfs+判素数):点击这里
- The magic apple tree(HDU-3290)(树上的dfs):点击这里
- Brexit Negotiations(Kattis-Northwestern Europe Regional Contest (NWERC) 2018)(贪心+dfs):点击这里
- 处女座和小姐姐(二)(2019牛客寒假算法基础集训营 Day3-F)(双向深搜):点击这里
- Bitonix' Patrol(CF-217D)(bitset+dfs):点击这里