Description
Given a diagram of Farmer John's field, determine how many ponds he has.
Input
* Lines 2..N+1: M characters per line representing one row of Farmer John's field. Each character is either 'W' or '.'. The characters do not have spaces between them.
Output
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
Hint
There are three ponds: one in the upper left, one in the lower left,and one along the right side.
Source
题意:
. . .
. W .
. . .
如上图:W可以连通八个方向。由题, 从W开始,先将W变为 . ,往八个方向搜索是否有W。进行dfs搜索。dfs次数就是答案
复杂度O(n*m*8) = O(m*n)
代码:
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 1e2 + 5;
char a[maxn][maxn];
int n, m;
void dfs(int x, int y) {
a[x][y] = '.';
for (int dx = - 1; dx <= 1; dx++) //移动方向
for (int dy = -1; dy <= 1; dy++) {
int nx = x + dx, ny = y + dy;
if (nx >= 0 && nx < n && ny >= 0 && ny < m && a[nx][ny] == 'W')
dfs(nx, ny);
}
return;
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> a[i];
int res = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (a[i][j] == 'W') {
dfs(i, j);
res++;
}
printf("%d\n", res);
return 0;
}