@[lty2023](/user/1037200)
什么题啊,看起来好难
哦,原来我做过啊,那还好……
废话不多说,看代码:
```c
#include <bits/stdc++.h>
using namespace std;
typedef long long l;
l n; // 地图的边长
l ways[35][35] = {2}; // 地图的数据,默认将所有的数据初始化为2
l dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, 1, -1}; // x坐标和y坐标的偏移值
void bfs(l x, l y) {
queue<pair<l, l>> q;
q.push(pair<l, l>{x, y});
ways[x][y] = 0;
while (!q.empty()) {
l tx, ty; // 偏移后的x坐标与y坐标
pair<l, l> front = q.front();
for (int i = 0; i < 4; i ++) {
tx = front.first + dx[i];
ty = front.second + dy[i];
if (tx > 0 && tx <= n + 2 && ty > 0 && ty <= n + 2) { // 判断边界(给边缘扩大了一圈)
if (ways[tx][ty] == 2) {
ways[tx][ty] = 0;
q.push(pair<l, l>{tx, ty});
}
}
}
q.pop(); // 弹出队列
}
return; // 完结撒花
}
int main () {
cin >> n; // 输入地图的边长
for (int i = 0; i < 35; i ++)
for (int j = 0; j < 35; j ++)
ways[i][j] = 2;
for (int i = 2; i <= n + 1; i ++) { // 输入地图数据
for (int j = 2; j <= n + 1; j ++) {
cin >> ways[i][j];
if (ways[i][j] == 0) ways[i][j] = 2; // 将所有的0变成2
}
}
bfs(1, 1); // 坐标需从1开始(毕竟整个地图都扩大了一圈了)
for (int i = 2; i <= n + 1; i ++) { // 输出地图
for (int j = 2; j <= n + 1; j ++) {
cout << ways[i][j] << ' ';
}
cout << endl;
}
return 0;
}
```
~~求关~~
by jzm0708 @ 2024-08-24 15:26:41
如果在下掏出这样的样例,阁下该如何应对呢
```
5
0 1 0 1 0
1 1 1 1 1
1 0 0 0 1
1 1 0 0 1
0 1 1 1 0
```
@[lty2023](/user/1037200)
by xiexinxin @ 2024-08-24 15:30:05
@[lty2023](/user/1037200) 要把边界全判断一遍,在你的代码上改的。
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,a[31][31];
void f(int x,int y){
if(a[x][y]==1||a[x][y]==0||x<0||y<0||x>=n||y>=n){
return;
}
a[x][y]=0;
f(x+1,y);
f(x,y+1);
f(x-1,y);
f(x,y-1);
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
if(a[i][j]==0){
a[i][j]=2;
}
}
}
for(int i=0;i<n;i++) f(0,i),f(i,0),f(n-1,i),f(i,n-1);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
```
by XuZile @ 2024-08-24 15:31:05
@[lty2023](/user/1037200) 有可能遇到以上有一些0被断开的情况,所以要从外面一层开始
by xiexinxin @ 2024-08-24 15:31:41
过了,全关注了
by lty2023 @ 2024-08-24 15:37:25