1 条题解

  • 0
    @ 2026-3-12 9:35:29

    文字教学

    这道题是经典的Flood Fill问题,用DFS(深度优先搜索)解决:

    1. 遍历每个格子,若遇到未被访问过的水('W'),说明发现了一个新水塘,计数加1。
    2. 用DFS从该格子出发,向8个方向(上下左右+四个对角线)搜索,把所有连通的'W'都标记为已访问,避免重复计数。
    3. 遍历结束后,计数就是水塘的总数。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 105;
    char g[N][N];
    bool vis[N][N];
    int n, m, ans;
    
    // 8个方向的偏移量
    int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
    int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
    
    void dfs(int x, int y) {
        vis[x][y] = true;
        for (int i = 0; i < 8; ++i) {
            int nx = x + dx[i], ny = y + dy[i];
            if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && g[nx][ny] == 'W' && !vis[nx][ny]) {
                dfs(nx, ny);
            }
        }
    }
    
    int main() {
        cin >> n >> m;
        for (int i = 1; i <= n; ++i) {
            cin >> (g[i] + 1);
        }
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                if (g[i][j] == 'W' && !vis[i][j]) {
                    ans++;
                    dfs(i, j);
                }
            }
        }
        cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    584
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    7
    已通过
    2
    上传者