題目來源
洛谷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);
}
}