https://www.luogu.com.cn/problem/P1162?contestId=67264https://www.luogu.com.cn/problem/P1162?contestId=67264思路:这个题让我们把被1包围的0给改为2,那么我们可以换一种思路,把与边界相邻的1给改为0.那么剩下的0就全是被1所包围的,然后把剩下的1都改为2输出即可。
AC代码
#include<iostream>
using namespace std;
int n,g[40][40];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
void dfs(int x,int y)
{
if(x<1||x>n||y<1||y>n||g[x][y]!=0)
return ;
g[x][y]=3;
for(int i=0;i<4;i++)
{
int tx=x+dx[i];
int ty=y+dy[i];
dfs(tx,ty);
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>g[i][j];
for(int i=1;i<=n;i++)
{
if(g[1][i]==0) dfs(1,i);
if(g[i][1]==0) dfs(i,1);
if(g[n][i]==0) dfs(n,i);
if(g[i][n]==0) dfs(i,n);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(g[i][j]==3)
cout<<"0 ";
else if(g[i][j]==0)
cout<<"2 ";
else
cout<<g[i][j]<<" ";
}
cout<<endl;
}
return 0;
}