題目鏈接
http://poj.org/problem?id=2386
大致題意
有一個大小爲N×M的園子,雨後積起了水。八連通的積水被認爲是連在一起的。求園子裏一共有多少水窪?
* * *
* W * 八連通指的就是左圖中相對W的*的部分
* * *
解題思路
題目的意思是說八聯通的積水算一個積水,所以只要從任意的W
開始,不停的把鄰接部分用.
替代,1次DFS之後與初始的W
連接的所有W
都被替換成了.
,因此直到圖中不再存在W
爲止,總共進行的DFS的次數就是答案了。
AC代碼
#include <iostream>
using namespace std;
char field[110][110];
int N, M;
//現在位置是(x,y)
void dfs(int x, int y)
{
//將現在所在的位置替換問'.'
field[x][y] = '.';
//循環遍歷移動的8個方向
for(int dx = -1; dx <= 1; dx++) {
for(int dy = -1; dy <= 1; dy++) {
int nx = x + dx;
int ny = y + dy;
//判斷(nx,ny)是不是在園子內,以及是否有積水
if(0 <= nx && nx <= N && 0 <= ny && ny <= M && field[nx][ny] == 'W') {
dfs(nx, ny);
}
}
}
return ;
}
int main()
{
int ans = 0;
cin >> N >> M;
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
cin >> field[i][j];
}
}
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
if(field[i][j] == 'W') {
//從·有W的地方開始DFS
dfs(i, j);
ans++;
}
}
}
cout << ans << endl;
return 0;
}