由于近日阴雨连天,约翰的农场中中积水汇聚成一个个不同的池塘,农场可以用 N x M (1 <= N <= 100; 1 <= M <= 100) 的矩形来表示。农场中的每个格子可以用'W'或者是'.'来分别代表积水或者土地,约翰想知道他的农场中有多少池塘。八连通的积水被认为是一块积水。
给你约翰农场的航拍图,确定有多少池塘?
Input
* 第1行:N 和 M
*第2行:N+1: M个字符一行,每个字符代表约翰的农场的土地情况。每个字符中间不包含空格。
Output
* 第1行:池塘的数量
Sample Input
10 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W.
Sample Output
3
首先这个题意就很坑,八连通指的是可以走八个方向。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 101;
char s[maxn][maxn];
int n, m;
int a[] = { 0,0,-1,1 ,1,1,-1,-1};
int b[] = { 1,-1,0,0 ,-1,1,1,-1};//a,b数组实现移动
void dfs(int x, int y)
{
for (int k = 0; k < 8; k++)
{
if (x + a[k] >= 0 && x + a[k] < n&&y + b[k] >= 0 && y + b[k] < m&&s[x + a[k]][y+b[k]]=='W')
{
s[x + a[k]][y + b[k]] = '.';//走过的w标记为.
dfs(x + a[k], y + b[k]);
}
}
}
int main()
{
int sum = 0;
scanf("%d%d", &n, &m);
getchar();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
scanf("%c", &s[i][j]);
}
getchar();
}
//输入
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (s[i][j] == 'W')//从第一个水洼开始
{
dfs(i, j);
sum++;
}
}
}
printf("%d\n", sum);
return 0;
}