深度优先搜索

来源:互联网 发布: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;


原创粉丝点击