题目描述
农夫约翰的农场可以表示成 N*M(1<=N<=100,1<=M<=100)个方格组成的矩形。由于近日的降雨,在约翰农场上的不同地方形成了池塘。每一个方格或者有积水('W')或者没有积水('.')。农夫约翰打算数出他的农场上共形成了多少池塘。一个池塘是一系列相连的有积水的方格,每一个方格周围的八个方格都被认为是与这个方格相连的。
现给出约翰农场的图样,要求输出农场上的池塘数。
输入
第 1 行:由空格隔开的两个整数:N 和 M
第 2..N+1 行:每行 M 个字符代表约翰农场的一排方格的状态。每个字符或者是'W'或者是'.',字符之间没有空格。
输出
第 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
数据范围限制
如题
提示【样例说明】共有 3 个池塘:一个在左上角,一个在左下角,还有一个沿着右边界
题解:
一道简单的搜索题,用dfs和gfs都可以
就是遍历一个二维数组,如果找到一个W就搜索,把所有和他连接构成一个池塘的W都变成 .
最后统计搜索了几次就行了
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=105;
int m,n;
char a[MAXN][MAXN];
int g[MAXN][MAXN],sum;
int stepy[]={1,1,1,0,0,-1,-1,-1},stepx[]={-1,0,1,-1,1,-1,0,1};
void dfs(int x,int y){
for(int i=0;i<=7;i++){
int X,Y;
X=x+stepx[i];
Y=y+stepy[i];
if(g[X][Y]){
g[X][Y]=0;
dfs(X,Y);
}
}
}
int main(){
// freopen("lkcount.in","r",stdin);
// freopen("lkcount.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='W')
g[i][j]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(g[i][j]){
g[i][j]=0;
dfs(i,j);
sum++;
}
}
cout<<sum;
return 0;
}