P1596 Lake counting

点击查看代码
#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;
}
posted @ 2026-01-04 17:01  gosaky  阅读(1)  评论(0)    收藏  举报