P1162 填涂颜色

思路:
(1)BFS
针对每一个e[i][j]==0的点进行BFS(涂色)。
(2)由于题目说"有一任意形状的由数字 1 构成的闭合圈",
那么找到这个闭合圈之后,直接输出即可,不需要继续染色。
(3)flag标记:此轮BFS是否碰到边界
如果碰到边界,本轮BFS完成后,将这些e[i][j]都改成-1
#include<bits/stdc++.h>
using namespace std;
int e[35][35],n,nxt[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
bool flag;
struct node{
int x,y;
};
void bfs(int sx,int sy)
{
queue<node> q;
node head;
flag=false;//默认没有碰到边界
int tx,ty;
q.push({sx,sy});
e[sx][sy]=2;
if(sx==1||sy==1||sx==n||sy==n) flag=true;
while(!q.empty()){
head=q.front();
q.pop();
for(int i=0;i<4;++i){
tx=head.x+nxt[i][0];
ty=head.y+nxt[i][1];
if(tx<1||ty<1||tx>n||ty>n) continue;
if(e[tx][ty]==0){
if(tx==1||ty==1||tx==n||ty==n) flag=true;
e[tx][ty]=2;
q.push({tx,ty});
}
}
}
if(flag){
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(e[i][j]==2) e[i][j]=-1;
}
}
}
else{
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(e[i][j]==-1) printf("0 ");
else printf("%d ",e[i][j]);
}
printf("\n");
}
exit(0);
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
cin>>e[i][j];
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(e[i][j]==0) bfs(i,j);
}
}
return 0;
}

浙公网安备 33010602011771号