注意:
- 搜索到墙/已经访问过的就停
- 注意加一个可以走的框
using namespace std;
#include <iostream>
#include <algorithm>
#include <cmath>
char a[40][40];
int fx[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int n;
void dfs(int x,int y)
{
if(x>n+1||x<0||y>n+1||y<0||a[x][y]=='v'||a[x][y]=='#') {return;} //注意加个可以走的一行列的框
else{ //如果没访问过,如果不是墙
a[x][y]='v';
for(int i=0;i<4;i++)
{
dfs(x+fx[i][0],y+fx[i][1]);
}
}
}
int main ()
{
int i,j;
cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
char t;
cin>>t;
if(t=='0'){a[i][j]=t;} //不知道是不是被包围的
else {a[i][j]='#';} //标记为墙,方便搜索之后改为1
}
}
dfs(0,0);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]=='v') {cout<<'0'<<" ";} //访问过,还是0
else if(a[i][j]=='#'){cout<<'1'<<" ";} //墙的话,表示1
else {cout<<'2'<<" ";} //没访问过的,上色为2
}
cout<<endl;
}
}