模拟+灌水——填涂颜色

来源:互联网 发布:怎样加入淘宝全球购 编辑:程序博客网 时间:2024/05/01 08:45

题目来源


洛谷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);}}


原创粉丝点击