数池塘

题目描述 

    农夫约翰的农场可以表示成 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值