1 条题解
-
0
文字教学
这道题用反向思维+DFS解决:闭合圈内的0无法到达边界,那我们先从边界的0出发,用DFS标记所有能到达边界的0(圈外的0),剩下的未被标记的0就是圈内的,改成2即可:
- 标记圈外0:遍历矩阵四条边,遇到0就从该位置开始DFS,向上下左右4个方向搜索,把所有连通的0都标记为“已访问”(这些是圈外的0)。
- 填充结果:遍历整个矩阵,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
- 上传者
京公网安备 11011102002149号