题目点这里
本题数据规模很小,直接开一个数组进行存储。
思路:先用dfs寻找一个在包围圈内的0,再以此个0为起始点进行bfs。
代码如下
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
using namespace std;
bool flag=false,b[50][50];
int a[50][50],sx,sy,fx[4]={0,1,0,-1},fy[4]={1,0,-1,0},n;
void print(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
void ran(){
int p=1,que[1000][4];
memset(que,0,sizeof(que));
que[1][0]=sx;que[1][1]=sy;a[sx][sy]=2;
while(1){
int zan=0;
for(int i=1;i<=p;i++){
for(int j=0;j<=3;j++){
int X=que[i][0]+fx[j],Y=que[i][1]+fy[j];
if(a[X][Y]==0){
a[X][Y]=2;
zan++;
que[zan][2]=X;
que[zan][3]=Y;
}
}
}
if(zan==0) return;
p=zan;
for(int i=1;i<=p;i++){
que[i][0]=que[i][2];
que[i][1]=que[i][3];
}
}
}
void pan(int x,int y){
if(flag==true) return;
if(a[x][y]==0&&(x==n||y==n||x==1||y==1)){
flag=true;
} else{
for(int i=0;i<=3;i++){
int X=x+fx[i],Y=y+fy[i];
if(b[X][Y]==false&&X>=1&&X<=6&&Y>=1&&Y<=6){
b[X][Y]=true;
pan(X,Y);
b[X][Y]=false;
}
}
}
return;
}
void copy(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==0) b[i][j]=false;
else b[i][j]=true;
}
}
}
int main(){
while(cin>>n){
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==0){
flag=false;
copy();
pan(i,j);
if(flag==false){
sx=i;sy=j;
ran();
print();
i=n+1;
break;
}
}
}
}}
return 0;
}