首页IT科技深度搜索 算法(c++深搜与宽搜的解题思路)

深度搜索 算法(c++深搜与宽搜的解题思路)

时间2025-06-14 09:30:53分类IT科技浏览4944
导读:写在开头:本文章提供深搜与宽搜的解题思路,无具体题目对应的代码,如想了解,请到个人主页查找,感谢观看。 深度优先搜索(DFS):...

写在开头:本文章提供深搜与宽搜的解题思路             ,无具体题目对应的代码                   ,如想了解        ,请到个人主页查找          ,感谢观看             。

深度优先搜索(DFS):

递归                  ,即函数调用自身           ,以逐步减小问题 的规模                     。但在一些问题中       ,并不是所有的 递归路径都是有效的      。 如图所示迷宫                  ,很可能会进入橙色所标识 的“死胡同             ”              ,只能回到之前的路径    ,直到 找到绿色的解为止         。

这种方法被称为回溯法                     。 回溯法往往会尝试一条尽可能深而完整的搜索路线                   ,直至完全无 法继续递归时才回溯                 ,因而需要用深度优先搜索(DFS) 实现         。

所以学会深度优先搜索前一定要深刻理解递归,先来看一段代码:

结果为:

5 4 3 2 1 *1 *2 *3 *4 *5

因为函数的不断嵌套                ,cout<<"*"<<x<<endl; 始终不会运行                    ,只有x-1=0时才会一层一层由小到大执行这一行      。

下面是回溯的一般形式:

1 回溯算法的一般形式如下: 2 void dfs(int k) { // k代表递归层数,或者说要填第几个空 3 if(所有空已经填完了){ 4 判断最优解/记录答案; 5 return; 6 } 7 for (枚举这个空能填的选项) 8 if (这个选项是合法的){//查看这个情况有没有被占位 9 记录下这个空(保存现场);//有时还需占位    ,例如四阶数独中的行             、列                   、块记录 10 dfs(k+1); 11 取消这个空(恢复现场);//如果占位了还需要取消占位 12 } 13 }

广度优先搜索(BFS):

深搜会尽快完成一个可行的解             ,再回溯尝试其他的可能性                     。 当解相对稀疏                   ,或问题很大时        ,深搜可能陷入过深        、过窄的“陷阱                   ”          ,这个时候就需要用到宽搜            。

广度优先搜索可以保证在求解最近          、最短                  、最快等一类问题时                  , 搜索到的首个解就是最优解   。

考虑另一种思路           ,从起点出发       ,类似于 泼水一般                  ,让水流顺着多个方向同时蔓延                     。 这种方法被称为洪泛法                。 洪泛法会扩展相同层更多的可能性以拓宽广 度              ,往往会使用广度优先搜索(BFS) 实现。

先来了解一些关于队列的函数(结果附在每行结束):

1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 queue<int> a; 5 cout<<a.empty()<<endl;//1 6 a.push(10);//{10} 7 cout<<a.front()<<endl;//{10} 8 cout<<a.empty()<<endl;//0 9 a.pop();//{} 10 cout<<a.empty()<<endl;//1 11 12 a.push(12); 13 a.push(13); 14 a.push(14);//{12,13,14} 15 cout<<a.front()<<endl;//{12} 16 17 return 0; 18 }

这样再理解广度优先搜索的算法就简单多了:

1 Q.push(初始状态); // 将初始状态入队 2 while (!Q.empty()) { 3 State u = Q.front(); // 取出队首 4 Q.pop();//出队 5 for (枚举所有可扩展状态) // 找到u的所有可达状态v 6 if (是合法的) // v需要满足某些条件    ,如未访问过           、未在队内等 7 Q.push(v); // 入队(同时可能需要维护某些必要信息) 8 }

总结:

回溯法/深度优先搜索(上图 a) :

  快速构造解                   ,使用递归                 。不撞南墙心不死                    。 但进入死路就回头了   。

洪泛法/广度优先搜索(上图 b):

   寻找最优解                 ,使用队列 从起点开始,逐层往外扩展             。

  优化技巧(剪枝):将不可能的解提前剪掉                     。

声明:本站所有文章                ,如无特殊说明或标注                    ,均为本站原创发布      。任何个人或组织    ,在未征得本站同意时             ,禁止复制       、盗用                  、采集              、发布本站内容到任何网站    、书籍等各类媒体平台         。如若本站内容侵犯了原著者的合法权益                   ,可联系我们进行处理                     。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
女人四十岁做什么赚钱(女人如何赚钱-40岁女人的觉醒,清醒的活法:努力赚钱) Lv3st帝法(LVI-SAM:配置环境、安装测试、适配自己采集数据集)