题目描述的也是比较清楚了,就是将遍历不到的位置输出为2(即闭合圈),其他位置按输入正常输出即可。代码也比较简单,直接看代码理解起来应该没什么问题!!!
这题bfs(个人觉得就是类似树的层序遍历)是正解,dfs(个人觉得dfs就是递归,比较好理解)搞不好会超时,下面附上dfs与bfs的AC代码
#include<bits/stdc++.h>
using namespace std;
int n;
int xx[]= {1,0,-1,0};//控制走的方向
int yy[]= {0,1,0,-1};
bool vis[100][100],a[100][100],temp[100][100];
void dfs(int x,int y) {
for(int i=0; i<4; i++) {
int dx=xx[i]+x;
int dy=yy[i]+y;
if(dx>=0&&dy>=0&&dx<=n+1&&dy<=n+1&&!vis[dx][dy]&&!a[dx][dy]) {
vis[dx][dy]=1;
dfs(dx,dy);
}
}
}
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
scanf("%d",&a[i][j]);
temp[i][j]=a[i][j];
}
}
vis[0][0]=1;
dfs(0,0);
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(!a[i][j]&&!vis[i][j]) {
printf("2 ");
} else {
printf("%d ",a[i][j]);
}
}
puts("");
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n;
bool a[100][100],vis[100][100];
int xx[]= {0,-1,1,0};
int yy[]= {1,0,0,-1};
int main() {
cin>>n;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
cin>>a[i][j];
}
}
queue<int> x;
queue<int> y;
x.push(0),y.push(0);
vis[0][0]=1;
while(!x.empty()) {
for(int i=0; i<4; i++) {
int dx=xx[i]+x.front();
int dy=yy[i]+y.front();
if(dx>=0&&dy>=0&&dx<=n+1&&dy<=n+1&&!vis[dx][dy]&&!a[dx][dy]) {
x.push(dx);
y.push(dy);
vis[dx][dy]=1;
}
}
x.pop();
y.pop();
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(!vis[i][j]&&!a[i][j]) {
cout<<2;
} else {
cout<<a[i][j];
}
cout<<" ";
}
cout<<endl;
}
return 0;
}