题目
题目描述
由数字 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 构成,围圈时只走上下左右 个方向。现要求把闭合圈内的所有空间都填写成 。例如: 的方阵(),涂色前和涂色后的方阵如下:
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1
输入格式
每组测试数据第一行一个整数 。
接下来 行,由 和 组成的 的方阵。
方阵内只有一个闭合圈,圈内至少有一个 。
//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)
输出格式
已经填好数字 的完整方阵。
样例 #1
样例输入 #1
6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
样例输出 #1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1
提示
对于 的数据,。
解题
方法一:BFS
思路
先通过遍历找到闭合圈的圈左上角坐标,根据题意,这个坐标右下角即为闭合圈内,对闭合圈内开始宽搜并同时把圈中的数字改为 。
代码
#include <iostream>
#include <queue>
using namespace std;
typedef pair<int, int> PII;
const int N = 40, DIRS[][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int n, g[N][N];
int main() {
scanf("%d", &n);
bool found;
int x, y;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
scanf("%d", &g[i][j]);
if (!found && g[i][j]) {
x = i, y = j;
found = true;
}
}
}
while (g[++x][++y]);
queue<PII> que;
que.push({x, y});
g[x][y] = 2;
while (!que.empty()) {
auto pr = que.front();
que.pop();
x = pr.first, y = pr.second;
for (auto& DIR : DIRS) {
int nx = x + DIR[0], ny = y + DIR[1];
if (nx >= 0 && nx < n && ny >= 0 && ny < n && !g[nx][ny]) {
g[nx][ny] = 2;
que.push({nx, ny});
}
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) printf("%d ", g[i][j]);
puts("");
}
return 0;
}
评论区