题目链接
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;
}