weixin_54893787
杀死杀手
2021-03-02 16:47

洛谷涂填颜色问题,我用广度遍历圈外的0,时间错误要咋改啊?

#include<iostream>
#include<queue> //广度搜索BFS总是和队列一起使用 
using namespace std;
int n;
int eg[35][35];
int fx[4]={-1,1,0,0};//上下
int fy[4]={0,0,-1,1};//左右四个方向 

struct node
{
	int x;
	int y;
};

bool flag=0;	
void bfs(int xx,int yy)
{
	queue<node>q;
	node p,w,v;

	p.x=xx;
	p.y=yy;
	q.push(p);	
	while(!q.empty()){
		w=q.front();
		q.pop();
		
		for(int i=0;i<4;i++){
			v.x=w.x+fx[i];
			v.y=w.y+fy[i];
			
			if(eg[w.x][w.y]==1) continue;//遇到1就停止,换另一个方向 
			if(w.x<0 || w.x>=n || w.y<0 || w.y>=n){ //范围之外,说明不在闭合圈内 
				eg[xx][yy]=-1; //对圈外的0进行染色 
				flag=1;
				break;		
			}
			q.push(v);
		}
		
		if(flag){
			flag=0;///////////////错误!!!!!!!!!!!
			break;
		} 
		
	}	
}

int main()
{
	cin>>n;		
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			cin>>eg[i][j];
	
	for(int i=0;i<n;i++)//遍历一遍所有点 
		for(int j=0;j<n;j++){
			if(eg[i][j]==0)//只遍历等于0的点 
				bfs(i,j);
				
		}		
			
	
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){//安排它 
			if(eg[i][j]==-1) cout<<0<<" ";
			if(eg[i][j]==1)  cout<<1<<" ";
			if(eg[i][j]==0)	 cout<<2<<" ";
		} 
		cout<<endl; 
	} 
	
	return 0;
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答