P1596题解
这道题的难度不大,输入一个n*m大小的图,输入为W代表这里有一滩水,‘.‘表示沙子,水的周围8个格子都算一个水坑,求总共有几个水坑,简单的来说就是求这张图的连通块的个数。
思路
面对这类求连通块个数的问题,我们可以对一个找到的W进行搜索,如果周围8个格子又有一个W,则递归搜索,虽然不知道为什么这潭水要在周围8个格子才能算一个水坑,我一开始以为是两个水坑有重叠就算一个
然后我们把搜索到的用‘ . ’覆盖掉,这样被算进一个水坑的W就不会重复计算。
以下是代码,上面说清楚了应该不需要注释了把
#include <iostream>
using namespace std;
const int MAX = 100 + 5;
char g[MAX][MAX];
int n, m;
int dir[8][2] = {{1,0}, {-1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1}, {1, 1}, {1, -1}};//8个方向
void solve(int x,int y)
{
g[x][y] = '.';
for (int i = 0; i < 8; i++){
int dx = x + dir[i][0];
int dy = y + dir[i][1];
if(dx<n && dx>=0 && dy<m && dy>=0 && g[dx][dy]=='W'){
solve(dx, dy);
}
}
return;
}
int main()
{
cin >> n >> m;
while(getchar()!='\n');
for (int i = 0; i < n; i++){
scanf("%s", g[i]);
}
int ans = 0;
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
if(g[i][j]=='W'){
solve(i, j);
ans++;//计算连通块个数
}
}
}
cout << ans;
return 0;
}