P1162 填涂颜色

搜索一直是弱项,要么想不到,要么想到不会写emmm
这道题用到bfs(队列),也是看了视频才会哒哒哒

1、添加两行0(原1-n,现0-n+1),这样图就是连续的了,也就是可以遍历到环外所有的0!但输入时只输入1-n的即可
2、遍历(貌似是模版了...)
(1)把第一个元素放入队列里,标记
(2)外层while循环,取队头元素的坐标,出队。四个方向走(涉及两个增量数组:dx[4],dy[4])
(3)对于每个方向:判出界;如果没被标记且值为0,也就是环外0,就改变其mark值,同时入队
3、根据mark值及数组值,进行输出。记得输出换行符

//大概懂了吧...
//添加两行,变为连续图;bfs遍历所有0(也就是环外的),将其进行标记为1 
#include<bits/stdc++.h>
using namespace std;
struct point{
	int x,y;
};
queue<point> q;
//增量数组,四个方向 
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int n,mark[35][35]={0},a[35][35]={0};
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}
//	将该点标记为已访问
    mark[0][0]=1; 
	q.push({0,0});
	while(!q.empty()){
		point p=q.front();
		q.pop();
//		bfs遍历 
		for(int i=0;i<4;i++){
			int x=p.x+dx[i];
			int y=p.y+dy[i];
//			越界判断 
			if(x>n+1||x<0||y>n+1||y<0) continue;
//			1不会被放入队列里,也就不会往里进行遍历,所以该bfs只遍历了环外的元素 
			if(mark[x][y]==0&&a[x][y]==0) {
			    mark[x][y]=1; 
				q.push({x,y});
			}
		}
	}
		for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(mark[i][j]==0&&a[i][j]==0) cout<<"2"<<" ";
			if(mark[i][j]==1&&a[i][j]==0) cout<<"0"<<" ";
			if(a[i][j]==1) cout<<"1"<<" ";
			if(j==n) cout<<endl;
		}
	}
	
	
}
posted @ 2025-03-30 10:13  夕瑶^  阅读(12)  评论(0)    收藏  举报