头像

欢迎来到我的博客

分享题解与总结

P1162 填涂颜色

image

思路:

(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;
}
posted @ 2026-02-16 10:24  king_steph1209  阅读(13)  评论(0)    收藏  举报