搜索 —— 深度优先搜索(DFS)
【概述】
深度优先搜索,是从初始状态起,利用一定的规则生成搜索树,寻找下一层任一个结点,检查是否出现目标状态,若未出现,以此状态利用规则生成再下一层任一个结点,再检查,重复过程一直到叶节点(即不能再生成新状态节点),当它仍不是目标状态时,回溯到上一层结果,取另一可能扩展搜索的分支。采用相同办法一直进行下去,直到找到目标状态为止。
状态必须在遍历完所有它的子状态之后,才能继续进行对同一层中下一个状态的遍历。
由于深度优先搜索是利用规则生成搜索树实现的,其符合栈的先进后出的性质,因此当需要搜索最深处的结点时,利用深搜较为适合。
在搜索的过程中,由于搜索的低效无法很好的处理重叠子问题,动态规划虽然较好的处理了重叠子问题但再一些具拓扑关系的题前较无奈,因此可采用记忆化搜索的方法,通过记忆化记录每个状态的搜索结果,在重复遍历一个状态时直接检索并返回。
简单地说就是:记忆化搜索=搜索的形式+动态规划的思想
【具体过程】
- 从当前元素进行拓展
- 若元素无法继续拓展,则将返回上层结点元素,继续 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):点击这里
搜索 —— 深度优先搜索(DFS)相关推荐
- networkx 有向图强连通_leetcode刷题(四):搜索(深度优先搜索,广度优先搜索)拓扑排序,强连通分量...
在开始今天的话题之前,我们先了解一个概念,什么是图的遍历? 图的遍历就是从图中某一点出发访遍图中其余剩余定点,且每个顶点仅被访问一次,这个过程叫做图的遍历. 图的遍历主要被分为深度优先遍历和广度优先遍 ...
- 常用算法2 - 广度优先搜索 深度优先搜索 (python实现)
1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...
- leetcode算法入门 第七天 广度优先搜索/深度优先搜索
leecode练习 733.图像渲染 695.岛屿最大面积 733.图像渲染 这道题题目很绕,其实就是一道深度优先搜索,将像素值相同的所有连通区域修改成新的像素值,只需要记录旧的像素值进行递归遍历即可 ...
- 0x22.搜索 - 深度优先搜索
目录 一.DFS三个经典NPC问题 1.子集和问题 2.全排列问题 3.N皇后问题 luogu P1219 [USACO1.5]八皇后 Checker Challenge luogu P1562 还是 ...
- 每日刷题总结——广度优先搜索 / 深度优先搜索
目录 286. 墙与门 417. 太平洋大西洋水流问题 1469. 寻找所有的独生节点 582. 杀掉进程 863. 二叉树中所有距离为 K 的结点 752. 打开转盘锁 1319. 连通网络的操作次 ...
- 剑指offer面试题12. 矩阵中的路径(矩阵搜索)(深度优先搜索)(剪枝)
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该 ...
- 优先深度搜索判断曲线相交_程序员必知的十大基础实用算法之-DFS(深度优先搜索)...
深度优先搜索 深度优先搜索是一种在开发爬虫早期使用较多的方法.它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) .在一个HTML文件中,当一个超链被选择后,被链接的HTML文件 ...
- 深度优先搜索(DFS)
深度优先搜索 深度优先搜索:从起点开始,当碰到岔道口时,总是选择其中一条岔路前进,在岔路上如果又遇到新的岔道口,仍然选择新岔道口的其中一条岔路前进,直到碰到死胡同才回退到最近的岔道口选择另一条岔路.( ...
- 深度优先搜索(DFS) + DFS的应用:字符串的排列问题
文章目录 深度优先搜索 基本思路: 举例: 穷举: 深度优先算法思路: DFS应用:全排列问题 深度优先搜索 深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法.其过程简要来说是对每一个可能的分 ...
最新文章
- oracle Database 10g后:闪回表
- 使用libssh2连接到远程服务器
- python定位文件位置_python使用相对定位,绝对定位,选取同级别文件下的指定文件(csv,excel)...
- why context node binding does not work in pop up window case
- bzoj2152 聪聪可可
- nginx的root和alias指令的区别
- python raise语句_Python异常处理,告别xxxxError!
- NUC1157 To the Max【最大子段和+DP】
- HDOJ 3507 Print Article(DP + 斜率优化)
- Java EE开发四大常用框架(1)
- QTP和翻译软件的故事
- Duplicate Symbols for Architecture解决办法
- Linu安装MySQL
- ios 振动棒软件_iOS 14很棒
- 篮桥杯,翻硬币 (贪心)
- Exif Editor For Mac(图像EXIF编辑器软件)
- decorate怎么读(decorated怎么读)
- java web打包神器_前端开发人员的桌面应用神器 Electron
- 云服务器定时执行python脚本
- delphi bpl包窗体继承