笔记——DFS

来源:互联网 发布:佛教源码 编辑:程序博客网 时间:2024/05/20 16:34
/*深度优先算法(DFS)——列举(基于图的搜索)
对于
1->2->3->4->6->7
2->1->3-4->6
3->1->2
4->1->2
5->6
6->1->2->5
7->1


以1为起点开始遍历,
1 找到 2
2 找到 3
3 找不到返回 2
2 找到 4
4 找不到返回 2
2 找到 6
6 找到 5
5 找不到返回 6
6 找不到返回 2
2 找不到返回 1
1 找到 7
7 找不到返回 1
1 找不到结束


就是这样一个遍历,返回的过程




void dfs(int x){
vis[x]=true;
for(int i=1;i<=n;i++){
if(!vis[i]&&e[x][i])dfs(i);
}
return;
}
*/


/*
判断连通块大多数都用DFS(个人认为)
*/


#include <stdio.h>
#include <string.h>


#define MAXN 100
#define MAXM 100


char G[MAXN][MAXM];
int n,m;
bool use[MAXN][MAXM];
int d[4][2]={{-1,0},{0,1},{1,0},{0,-1}};


void DFS(int x,int y)
{
    use[x][y]=true;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            int dx=x+d[i][0];
            int dy=y+d[i][1];
            if(dx>=0&&dy>=0&&dx<n&&dy<m&&!use[dx][dy]&&G[dx][dy]=='*')
            {
                DFS(dx,dy);
            }
        }
    }
}


int solve()
{
    int ans=0;
    memset(use,false,sizeof(use));
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(!use[i][j]&&G[i][j]=='*')
            {
                DFS(i,j);
                ans++;
            }
        }
    }
    return ans;
}


int main()
{
    while(~scanf("%d %d",&n,&m))
    {
        for(int i=0;i<n;i++)
        {
            scanf("%s",G[i]);
        }


        printf("%d\n",solve());
    }
    return 0;
}


/*
5 5
**...
..**.
**.*.
.*.*.
*****
2
*/