深度优先搜索,简称\(\text {DFS}\)(\(\text {Depth First Search}\)),顾名思义,就是搜索时的深度优先。
\(\text {DFS}\) 的本质其实是暴力枚举,只不过 \(\text {DFS}\) 在枚举时会检测当前枚举的选项是否符合条件,
如果符合,保存此选项,枚举下一个选项;反之更换一个选项,尝试此选项是否合法;但如果此时
(资料图片仅供参考)
发现没有可枚举的选项了,也就是所有的选项有不合法,进行「回溯」操作,更换上一个选项。
这样,枚举时就可以避免枚举许多无效的状态,以此节省时间。
可以举一个这样的例子:\(\text {DFS}\) 是一个有点智慧的人,他会想想自己干的事情有没有意义,
没有的话就放弃这个事情;
而枚举就是一个老实的人,他会老老实实的把所有活都干完,但却不知道自己干了一堆
没有意义的事。
刚刚所说 \(\text {DFS}\) 其实是图论中的一个概念。在搜索中常常指回溯算法,它们之间的关系在此不多说明,
只需知道 \(\text {DFS}\) 是一种搜索的算法即可。
\(\text {DFS}\) 的常见形式如下
void dfs(当前枚举到的选项){ if(所有的状态都枚举完毕){ 输出/保存结果 return; } for(枚举当前选项) if(这个选项是合法的){ 记录这个选项 dfs(下一层枚举的状态); 取消这个选项 }}
给定一个 \(N \times M\) 方格的迷宫,迷宫里有 \(T\) 处障碍,障碍处不可通过。
在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
给定起点坐标 \(SX,SY\) 和终点坐标 \(FX,FY\),每个障碍物的 \(X,Y\),每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。
\(N \le M \le 5\)
这题我们可以枚举移动的方向,记录,再判断路上有没有障碍物,很明显时间允许,可以 \(\color {green} {\texttt {AC}}\),但要是 \(N \le M \le 30\) 呢?
这时,我们就可以使用 \(\text {DFS}\) 了。
我们枚举上下左右四个方向,同时判断移动的方向有没有障碍物和有没有走过,分别用 \(a\) 和 \(note\) 记录,
再用一个 \(sum\) 记录解的数量,用 \(x,y\) 记录当前 \(dfs\) 枚举到的位置,代码:
#includeusing namespace std;int n,m,t,fx,fy,sx,sy,sum;int a[6][6],note[6][6],next1[5][2] = {{114514,1919810},{0,1},{1,0},{0,-1},{-1,0}}; // 存储地图和走过的位置void dfs(int x,int y){ if(x == fx && y == fy){ // 如果到了终点 sum ++; // 记录解的数量 return; } for(int i = 1;i <= 4;i ++){ // 枚举方向 int next_x = x + next1[i][0],next_y = y + next1[i][1]; // 计算下一步的坐标 if(!a[next_x][next_y] && !note[next_x][next_y]){ // 如果没有障碍物且也没走过 note[next_x][next_y] = 1; // 标记为走过 dfs(next_x,next_y); // 继续走迷宫 note[next_x][next_y] = 0; // 走完后恢复,方便下一次枚举 } }}int main(){ cin>>n>>m>>t; cin>>sx>>sy>>fx>>fy; for(int i = 1;i <= t;i ++){ int x,y; cin>>x>>y; a[x][y] = 1; } // 以上为输入 a[sx][sy] = 1; // 标记起点为障碍物,防止无限来回 for(int i = 0;i <= n + 1;i ++) for(int j = 0;j <= m + 1;j ++) if(i == 0 || i == n + 1 || j == 0 || j == m + 1)a[i][j] = 1; // 标记边缘为障碍物 dfs(sx,sy); // go,go,go!开始走迷宫 cout<
完美 \(\color {green} {\texttt {AC}}\)!\(\text {DFS}\) 太厉害了吧!但还记得我说的吗?\(\text {DFS}\) 只是个有点智慧的人,如果有一个迷宫,但是它有许多岔路口,而且它有一个超级长的死胡同,会怎样?很明显,\(\text{DFS}\) 越走越深,最后在大量的回溯枚举中 \(\texttt {TLE}\)……也就是说,\(\text {DFS}\) 是「不撞南墙不回头」,不遇到非合法情况他就会一直走下去,有的时候真的会有问题……这时,\(\text {BFS}\) 就该出场了。欲知后事如何,且看下回分解。
关键词:
[算法笔记] DFS搜索
为什么有些人不长智齿 为什么有些人皮肤白
向管理和人才要效益 伊利股份预定下一个十年增长
赴青春之约 展逐梦风采——写在成都第31届世界大学生夏季运动会开幕之际
车载导航怎么关闭广告 车载导航怎么关闭
翼龙贷网贷逾期5000不还会上征信吗
wcg2010世界总决赛完整版_wcg2010世界总决赛
奔腾g3260cpu怎么样(奔腾g3260核显什么级别)
河北省继续发布暴雨红色预警信号
《最终幻想14》7.0版本配置升级:最低要求GTX970
金融汽车合力反攻,多空比攀升至1.1,走or留?
浪漫绝美!成都大运会开幕式的6个难忘瞬间
中央气象台继续发布暴雨橙色预警:河南等12省市将有大到暴雨
“杜苏芮”登陆福建:抗击台风的24小时
巧克力有利于心血管健康?权威机构:我可没说过
股票行情快报:银信科技(300231)7月28日主力资金净买入820.98万元
楚子航迈巴赫是什么梗(楚子航迈巴赫的解释)
桃源农商银行:“细心盘问”阻截不明转账 为客户挽损7万元!
大悦城:子公司拟挂牌转让上海鹏利100%股权
韩总统尹锡悦会见荷兰光刻机巨头阿斯麦CEO温宁克 探讨扩大半导体合作
圆通速递(600233.SH):目前公司生产经营一切正常,业务发展良好
个旧:打防并举构建基层“黄非”治理新格局
驿城区卫健体委机关党支部开展专题党课学习
ucs32p.dll丢失一键修复
7月28日华东地区TDI市场观望运行
快来青浦看萤火虫吧~
夏季整治行动丨“微光”聚爱 终成熠熠星光
峨眉山雪芽怎样
天风证券给予新产业买入评级,深耕化学发光二十余载,国内化学发光行业领先者,目标价格为78.45元
贝尼托:贝林厄姆未来将成为领导者 大卫-席尔瓦比人们说的还要好
刚生完宝宝能减肥吗?宝妈减肥分两大阶段
数据说|敢问“数据交易所”路在何方
咖啡馆命名Doi被指低俗 上海黄浦区市场监管局:立案调查
公安部交管局启动高等级恶劣天气应急响应机制
福建海事局启动防台Ⅰ级响应 全省海上应急力量进入待命状态
Squat University-试试这个保加利亚深蹲变式
相关新闻