点击查看代码
#include <iostream>
using namespace std;
// 题目说明 N, M <= 100,所以数组开稍微大一点防越界
const int MAXN = 105;
int N, M;
char field[MAXN][MAXN]; // 存地图
// 定义八个位移的方向数组,坐标法
int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
//dfs查找这个格子连着的所有水坑,并标记为旱地
void dfs(int x, int y) {
//1.标记为旱地,防止重复访问
field[x][y] = '.';
//2.开启循环,遍历方向
for (int i = 0; i < 8; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
// 3. 判断是否越界,以及是否是谁,就是筛选与标记
if (nx >= 0 && nx < N && ny >= 0 && ny < M) {
if (field[nx][ny] == 'W') {
dfs(nx, ny);
}
}
}
}
int main() {
// 1.读入数据
cin >> N >> M;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> field[i][j];
}
}
int ans = 0;
// 2. 遍历每一个格子
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
//如果遇到了水说明发现了一个新湖,扩散查找并把对应的位置都标记为旱地
if (field[i][j] == 'W') {
dfs(i, j);
ans++;
}
}
}
// 3. 输出结果
cout << ans << endl;
return 0;
}