DFS专题 POJ2386

题目:

由于最近下雨,水在农民约翰的田里的各个地方汇集起来,用一个N×M(1<=N<=100;1<=M<=100)正方形表示。每一个正方形包含水(“W”)或旱地(“.”)。农场主约翰想弄清楚他的田里有多少池塘。池塘是一组有水的相连的正方形,其中一个正方形被认为与它的八个邻居相邻。给一张农夫约翰的田地图,确定他有多少池塘。

思路:

讲真我不知道这题想表达是什么

这题是求连通块的个数。

 

小技巧:

八方向如何表示 

for(int dx=-1;dx<=1;dx++)
    for(int dy=-1;dy<=1;dy++)
            int nx=i+dx,ny=j+dy;//i,j 为坐标

 

 

AC代码:

 

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=110;
char mp[N][N];
int n,m;

void dfs(int i,int j)
{
    mp[i][j]='.';
    for(int dx=-1;dx<=1;dx++)
        for(int dy=-1;dy<=1;dy++)
        {
            int nx=i+dx,ny=j+dy;
            if(nx>=0&&nx<n&&ny>=0&&ny<m&&mp[nx][ny]=='W') dfs(nx,ny);
        }
        return ;
}
int main()
{
    int res=0;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
                cin>>mp[i][j];
                
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            if(mp[i][j]=='W')
            {
                dfs(i,j);
                res++;
            }
        }
    cout<<res<<endl;
    return 0;
}

 

posted @ 2020-02-14 16:01  yrmp007  阅读(117)  评论(0)    收藏  举报