深度优先搜索
来源:互联网 发布:sql count 显示多列 编辑:程序博客网 时间:2024/06/06 06:57
深度优先搜索,dfs顾名思义,是树的先根遍历的推广。
初始状态所有点均未被访问,深度优先搜索从某一点出发,访问此点,同时对该点做标记,然后遍历与该点相邻的其他顶点,若其他顶点已经被标记,返回。直到所有点都被访问。
主要步骤:
1.确定并访问初始点。
2.若该点的邻接点没有被访问过,对该点进行深度优先搜索。(很明显,在这里要用到递归)
3.如果该点的某一邻接点已经被标记过,返回该点,并找下一个邻接点。
沿着一条路走到黑的感觉....
模板(仅供参考):
int dir[4][2]={1,0,-1,0,0,1,0,-1};//定义方向数组,方便往四个方向遍历。
char str[110][110];
void dfs(int i,int j)
{
if(不符合继续遍历的条件)//判断该点是否符合题意,不符合则return;
return ;
vis[i][j]=1;//标记这个点,以防下次搜索再次搜索到
posn++;//posn是依据题目要求用于记录数据
for(int k=0;k<4;k++)//往四个方向搜索
{
dfs(i+dir[k][0],j+dir[k][1]);//用递归的方法像四个方向遍历。
}
}
经典例题!
小蝌蚪安家:
3 3
###
##.
...
4
#include<iostream>
#include<string.h>
using namespace std;
char str[100][100];
int visit[100][100]={0};//标记数组
int dir[4][2]={1,0,-1,0,0,1,0,-1};//方向数组
int num;//记录数据
int n,m;
int max(int x,int y)
{
return x>y?x:y;
}
void dfs(int i,int j)
{
if(i<0||i>=n||j<0||j>=m||visit[i][j]||str[i][j]=='#')
return ;
visit[i][j]=1;
num++;
for(int k=0;k<4;k++)
{
dfs(i+dir[k][0],j+dir[k][1]);
}
}
int main()
{
cin>>n>>m;
int Max=0;
memset(visit,0,sizeof(visit));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cin>>str[i][j];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
num=0;
if(str[i][j]=='.'&&!visit[i][j])
dfs(i,j);
Max=max(num,Max);
}
}
cout<<Max<<endl;
return 0;
}
- 深度优先搜索
- 深度优先搜索
- 深度优先搜索 DFS
- 深度优先搜索遍历
- 深度优先搜索 DFS
- 深度优先搜索
- 深度优先搜索
- 深度优先搜索算法
- hdoj1015Safecracker(深度优先搜索)
- [AI]深度优先搜索
- 深度优先搜索算法
- DFS 深度优先搜索
- 深度优先搜索
- 深度优先搜索算法
- 图解深度优先搜索
- 深度优先搜索
- 深度优先搜索
- 深度优先搜索算法
- laravel模板中生成URL的几种模式
- Spring如何整合Hibernate
- 20170814心情总结
- pycharm2016破解方法
- Qt 登陆界面实现
- 深度优先搜索
- HDU 6080 2017"百度之星"程序设计大赛
- 十三、基础教程-HTML标签(labels)
- Qt 主界面菜单栏和状态栏实现
- UVA580CriticalMass
- 简易抽奖网页
- 数据结构实验之图论六:村村通公路
- hdu 6108 小C的倍数问题(同余定理)
- Autocomplete CodeForces