题目来源
洛谷P1162填涂颜色
https://www.luogu.org/problem/show?pid=1162
思路
由于方阵中只有一个闭合圈 所以所有不在圈中的空间都可以从方阵外部到达
所以可以用从外部模拟灌水的方法 所有可以从外部不能到达的空间即为圈内空间
从外部进行深搜 标记可以到达的点(圈外点)为2 则圈边沿仍为1 圈内仍为0
输出时 根据题目要求 圈外点为0 圈边沿为1 圈内为0
所以输出(2-该点标记)即可
代码(C++)
#include <cstdio>
using namespace std;
int n,k[35][35];
int mx[5]={0,-1,0,0,1},my[5]={0,0,-1,1,0};
inline void search(int x,int y);
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&k[i][j]);
for(int i=1;i<=n;++i)
if(k[1][i]==0)
search(1,i);
for(int i=2;i<n;++i)
{
if(k[i][1]==0)
search(i,1);
if(k[i][n]==0)
search(i,n);
}
for(int i=1;i<=n;++i)
if(k[n][i]==0)
search(n,i);
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
printf("%d ",2-k[i][j]);
printf("\n");
}
return 0;
}
inline void search(int x,int y)
{
k[x][y]=2;
for(int i=1;i<=4;++i)
{
int xx=x+mx[i],yy=y+my[i];
if(xx<=0||yy<=0||xx>n||yy>n||k[xx][yy]!=0)
continue;
search(xx,yy);
}
}