您的位置:首页 > 其它

【2014.8.17NOIP普及组模拟】数池塘//2018.2.3

2018-02-04 12:03 253 查看

题目

题目描述

农夫约翰的农场可以表示成N*M(1<=N<=100,1<=M<=100)个方格组成的矩形。由于近日的降雨,在约翰农场上的不同地方形成了池塘。每一个方格或者有积水(’W’)或者没有积水(’.’)。农夫约翰打算数出他的农场上共形成了多少池塘。一个池塘是一系列相连的有积水的方格,每一个方格周围的八个方格都被认为是与这个方格相连的。

现给出约翰农场的图样,要求输出农场上的池塘数。

输入

第1行:由空格隔开的两个整数:N和M

第2..N+1行:每行M个字符代表约翰农场的一排方格的状态。每个字符或者是’W’或者是’.’,字符之间没有空格。

输出

第1行:约翰农场上的池塘数

题目大意

农场上有“W”“.”的状态,相连的“W”是一个池塘,求池塘数

解题思路

只要没有搜过,就继续深搜……

代码

#include<cstdio>
#include<iostream>
using namespace std;
int n,m,ans; bool a[110][110];

void dfs(int x,int y)
{
if (x<1||y<1||x>n||y>m) return; //边界处理
if (a[x][y]==false) return; //如果已经搜过或是“.”
a[x][y]=false;
dfs(x+1,y);
dfs(x,y+1);
dfs(x-1,y);
dfs(x,y-1);
dfs(x-1,y-1);
dfs(x+1,y+1);
dfs(x-1,y+1);
dfs(x+1,y-1); //八个方向深搜
}

int main()
{
freopen("lkcount.in","r",stdin);
freopen("lkcount.out","w",stdout);
scanf("%d%d",&n,&m);
char c;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
cin>>c;
if (c=='W') a[i][j]=true; //布尔储存
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (a[i][j]==true)
{
ans++; dfs(i,j); //深搜
}
printf("%d",ans); //输出
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  深搜