解题思路:
(1)首先看完题,要求将1围起来的0全部变为2,表示闭合圈,边界还是1,那么可以想到我找到一个点,然后顺着这个点开始从4个方向搜索,将所有外围的0全部变为2,表示闭合圈外
(2)那么我们只需要找到这个点就行了,从1行1列,开始搜索,但是这里面存在一个问题,万一1行1列就是墙壁怎么办呢?那我就没法搜索了。还有一些情况,比如闭合圈的正好在这个正方形的的对角线上,那么分割成的两块区域就没法从1个点开始搜索。
(3)如何来规避这种情况呢,我们可以试着将圈扩大一步,因为题里面说了只有一个闭合圈,用这种方法,就算不仅仅是只有一个闭合圈,n个闭合圈也都可以将所有外围标注,因为扩大了一圈,从0,0开始搜,通过DFS,就可以走遍所有的路线。
(4)最后只把人家要的部分输出出来即可
#include<bits/stdc++.h>
using namespace std;
int n;
int a[110][110];//表示地图
int dx[5]={-1,1,0,0};//表示行号的方向数组
int dy[5]={0,0,-1,1};//表示列号的方向数组
void dfs(int x,int y)
{
a[x][y]=2;//将闭合圈外的点全部设为2
for(int i=0;i<=3;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];//形成新的行列号
if(xx>n+1||xx<0||yy>n+1||yy<0)//如果越界的话
continue;
if(a[xx][yy]==0)//如果该点是0
dfs(xx,yy);//继续递归
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cin>>a[i][j];
}//输入地图
dfs(0,0);//从第0行0列开始搜索
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]==2)//如果是2,说明是外围
cout<<0<<" ";//输出的是0
else if(a[i][j]==0)//如果是0,说明是里面
cout<<2<<" ";//输出的是2
else//如果是其他的,就输出1,表示墙壁
cout<<1<<" ";
}
cout<<endl;
}
return 0;
}