DFS

来源:互联网 发布:360路由器怎么链接网络 编辑:程序博客网 时间:2024/05/18 01:34

深优的话,占内存少,能找到最优解(一定条件下),但能很快找到接近解(优点),可能不必遍历所有分枝(也就是速度快), 深优的一个应用就是连连看游戏.

深度优先搜索法有递归以及非递归两种设计方法。一般的,当搜索深度较小、问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂。当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设计比较好。不一定会得到最优解,这个时候需要修改原算法:把原输出过程的地方改为记录过程,即记录达到当前目标的路径和相应的路程值,并与前面已记录的值进行比较,保留其中最优的,等全部搜索完成后,才把保留的最优解输出。


一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的特点是"搜到就是最优解", 而深搜用于找多个解或者是"步数已知(好比3步就必需达到前提)"的标题,它的空间效率高,然则找到的不必定是最优解,必需记实并完成全数搜索,故一般情况下,深搜需要很是高效的剪枝(优化).


像搜索最短路径这些的很显著若是用广搜,因为广搜的特征就是一层一层往下搜的,保证当前搜到的都是最优解,当然,最短路径只是一方面的操作,像什么起码状态转换也是可以操作的。


深搜就是优先搜索一棵子树,然后是另一棵,它和广搜对比,有着内存需要相对较少的所长,八皇后标题就是典范楷模的操作,这类标题很显著是不能用广搜往解决的。或者像图论里面的找圈的算法,数的前序中序后序遍历等,都是深搜


hdu1241可以看作是dfs的简单模板

某石油勘探公司正在按计划勘探地下油田资源。他们工作在一片长方形的地域中,首先将该地域划分为许多小正方形区域,然后使用探测设备分别探测每一块小正方形区域是否有油。若在一块小正方形区域中探测到有油,则标记为’@’,否则标记为’*’。如果两个相邻区域都为1,那么它们同属于一个石油带,一个石油带可能包含很多小正方形区域,而你的任务是要确定在一片长方形地域中有多少个石油带。所谓相邻,是指两个小正方形区域上下、左右、左上右下或左下右上同为’@’。 


#include <iostream>#include <cstring>using namespace std;const int MAX=101;int m,n;char map[MAX][MAX];   //地图int dir[8][2]={0,1,1,0,0,-1,-1,0,1,1,-1,-1,1,-1,-1,1};  //8个移动方向void dfs(int x,int y){map[x][y]='*';  //已遍历,记为*,防止二次遍历for (int i = 0;i < 8;i++){//往(x,y)剩下的8个方向遍历int x1 = x + dir[i][0];int y1 = y + dir[i][1];if (x1>=0&&y1>=0&&x1<m&&y1<n&&map[x1][y1]=='@')   //m,n的位置不能搞错{dfs(x1,y1);   // 符合条件的继续遍历它的8个方向}}}int main(){int ans;while (cin>>m>>n&&(m||n)){ans = 0 ;for (int i = 0; i< m;i++){for (int j = 0; j < n;j++){cin>>map[i][j];}}for (int i = 0;i < m;i++){for (int j = 0; j < n;j++){if (map[i][j]=='@'){dfs(i,j);ans+=1;}}}cout<<ans<<endl;}return 0;}



0 0
原创粉丝点击