Lake Counting
湖计数
描述 由于最近的降雨,许多地方的水都汇集在农民约翰的田地里,它的代表是一个矩形的NxM(1<=N<=100;1<=M<=100)平方。每个广场都有水(‘W’)或旱地(‘.’)。农夫约翰想知道他的田地里形成了多少池塘。池塘是一组连在一起的正方形,里面有水,其中一个正方形被认为与它的八个邻居相邻。 输入 *第1行:两个空格分隔的整数:n和M 输出量 *第1行:农民约翰田里的池塘数。 样本输入 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 暗示 产出详情: |
这一题就是从任意一个‘W’开始1次DFS将跟‘W’所有有关联的W全部变为‘.’然后遍历的次数就是答案。
具体看代码
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int N,M;
const int maxn=1e3+10;
char vis[maxn][maxn];
void dfs(int x,int y)
{
vis[x][y]='.';
for(int dx=-1;dx<=1;dx++)
{
for(int dy=-1;dy<=1;dy++)
{
int nx=x+dx,ny=y+dy;
if(0<=nx&&nx<N&&0<=ny&&ny<M&&vis[nx][ny]=='W')
{
dfs(nx,ny);
}
}
}
}
int main()
{
int num=0;
cin>>N>>M;
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
cin>>vis[i][j];
}
}
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
if(vis[i][j]=='W')
{
dfs(i,j);
num++;
}
}
}
cout<<num<<endl;
}