TZOJ 3286:湖计数 深搜


描述

由于最近的降雨,在 Farmer John 的田地的各个地方积水,由 N x M (1 <= N <= 100; 1 <= M <= 100) 正方形组成的矩形表示。每个方格包含水('W')或旱地('.')。农夫约翰想弄清楚他的田地里形成了多少池塘。池塘是一组相连的正方形,里面有水,其中一个正方形被认为与其所有八个邻居相邻。

给定农民约翰的田地图,确定他有多少池塘。

输入

* 第 1 行:两个以空格分隔的整数:N 和 M

* 第 2..N+1 行:每行 M 个字符代表 Farmer John 的田地的一行。每个字符都是“W”或“.”。字符之间没有空格。

输出

* 第 1 行:Farmer John 田地中的池塘数量。

样例输入

 

10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

样例输出

 3

提示

输出细节:

共有三个池塘:一个在左上角,一个在左下角,一个在右侧。

AC感想:

深搜模板,输入地图-初始化-dfs开搜-将所有可标记点标记-记录答案

dfs:找下一步的坐标-判断是否越界-判断是否可走-可走则标记下一步,以下一步为起点继续深搜

#include
#include
#include
#include
using namespace std;
struct node{
    int x,y,step;
};
node a[3000];
char mmp[101][101];
int sum = 0,f,have=0;
int n,m;
int sx,sy;
int book[101][101];
int nex[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
void dfs(int x,int y)
{
    int tx,ty;
    book[x][y] = 1;
    for(int i=0;i<8;i++)
    {
        tx = x+nex[i][0];
        ty = y+nex[i][1];
        if(tx<1||tx>n||ty<1||ty>m)continue;
        if(mmp[tx][ty]!='.'&&book[tx][ty]!=1)
        {
            book[tx][ty]=1;
            dfs(tx,ty);
        }
    }
    
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>mmp[i][j];
            
        }
        getchar();
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(mmp[i][j]=='W'&&book[i][j]!=1)
            {
                sx = i;
                sy = j;
                have = 1;
                dfs(sx,sy);
                sum++;
            }
        }
    }
    cout<endl;
    return 0;
}