1 条题解

  • 0
    @ 2026-3-13 9:27:12

    文字教学

    这道题用反向思维+DFS解决:闭合圈内的0无法到达边界,那我们先从边界的0出发,用DFS标记所有能到达边界的0(圈外的0),剩下的未被标记的0就是圈内的,改成2即可:

    1. 标记圈外0:遍历矩阵四条边,遇到0就从该位置开始DFS,向上下左右4个方向搜索,把所有连通的0都标记为“已访问”(这些是圈外的0)。
    2. 填充结果:遍历整个矩阵,1保持不变;被标记的0是圈外的,输出0;未被标记的0是圈内的,输出2。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 35;
    int g[N][N], vis[N][N];
    int n, dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};
    
    void dfs(int x, int y) {
        vis[x][y] = 1;
        for (int i = 0; i < 4; ++i) {
            int nx = x + dx[i], ny = y + dy[i];
            if (nx >= 1 && nx <= n && ny >= 1 && ny <= n && g[nx][ny] == 0 && !vis[nx][ny]) {
                dfs(nx, ny);
            }
        }
    }
    
    int main() {
        cin >> n;
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= n; ++j)
                cin >> g[i][j];
        
        // 从边界的0开始DFS
        for (int i = 1; i <= n; ++i) {
            if (g[1][i] == 0 && !vis[1][i]) dfs(1, i);
            if (g[n][i] == 0 && !vis[n][i]) dfs(n, i);
            if (g[i][1] == 0 && !vis[i][1]) dfs(i, 1);
            if (g[i][n] == 0 && !vis[i][n]) dfs(i, n);
        }
        
        // 输出结果
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (g[i][j] == 1) cout << 1 << " ";
                else if (vis[i][j]) cout << 0 << " ";
                else cout << 2 << " ";
            }
            cout << endl;
        }
        return 0;
    }
    
    • 1

    信息

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