POJ2386-Lake Counting

【题目描述】

有一个大小为M*N的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里共有多少水洼?(八连通指的是下面图中相对W的*的部分)
***
*W*
***

【输入】

第一行包含两个正整数 N 和 M,表示将一个园子地面分成N*M块方格,N 行,M列,接下来的 N 行描述了园子地面状况,其中‘W’表示积水的水洼,‘.’表示没有积水。

【输出】

仅一个数,表示水洼的总数。

【输入示例】

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

【思路】

很简单的搜索题,像我这样的蒟蒻都能做出来。

只要用二层循环把每个水洼第一个被搜到的部分搜索,计数器++。

搜索把每个可能去的地方走一遍。

把第一个搜到的部分设为平地。

【代码】

#include<iostream>
using namespace std;
int m,n,cnt=0;
char ct[100][100];
void s(int x,int y)
{
    ct[x][y]='.';
    int i,j;
    for(i=-1;i<=1;i++)
    {
        for(j=-1;j<=1;j++)
        {
            if(ct[x+i][y+j]=='w'&&x+i>=0&&x+i<m&&y+j>=0&&y+j<n)
            {
                s(x+i,y+j);
            }
        }
    }
    return;
}
int main()
{
    cin>>m>>n;
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            cin>>ct[i][j];
        }
    }
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            if(ct[i][j]=='w')
            {
                s(i,j);
                cnt++;
            }
        }
    }
    cout<<cnt;
    return 0;
}

 

 

 

posted @ 2018-08-07 15:27  ༺ཌༀཉི叱咤༒風云༃ༀད༻  阅读(135)  评论(0编辑  收藏  举报