截取自《挑戰程序設計競賽》。
有一個大小爲 N*M 的園子,雨後積起了水。八連通的積水被認爲是連接在一起的。請求出園子裏有多少水窪?
N,M<= 100
輸入
N=10, M=12
W…WW.
.WWW…WWW
…WW…WW.
…WW.
…W…
…W…W…
.W.W…WW.
W.W.W…W.
.W.W…W.
…W…W.
輸出
3
#include <iostream>
#include <cstdio>
const int MAX_N = 100, MAX_M = 100;
int N, M;
char field[MAX_N][MAX_M + 1];
void dfs(int x, int y) {
field[x][y] = '.';
for (int dx = -1; dx <= 1; ++dx) {
for (int dy = -1; dy <=1; ++dy) {
int nx = x + dx, ny = y + dy;
if (0 <= nx && nx < N && 0 <= ny && ny < M && field[nx][ny] == 'W')
dfs(nx, ny);
}
}
return ;
}
void solve() {
int res = 0;
for (int i = 0; i < N; ++i) {
for (int j = 0; j <M; ++j) {
if (field[i][j] == 'W') {
dfs(i, j);
res++;
}
}
}
printf("%d\n", res);
}
int main()
{
scanf("%d %d", &N, &M);
printf("N = %d, M = %d\n", N, M);
for (int i = 0 ; i < N; ++i) {
scanf("%s", &*field[i]);
}
solve();
return 0;
}