洛谷P1162填涂颜色

题目点这里
在这里插入图片描述本题数据规模很小,直接开一个数组进行存储。

思路:先用dfs寻找一个在包围圈内的0,再以此个0为起始点进行bfs。

代码如下

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
using namespace std;
bool flag=false,b[50][50];
int a[50][50],sx,sy,fx[4]={0,1,0,-1},fy[4]={1,0,-1,0},n;
void print(){
	 for(int i=1;i<=n;i++){
	 	for(int j=1;j<=n;j++){
	 		cout<<a[i][j]<<" ";
		 }
		 cout<<endl;
	 }
}
void ran(){
	 int p=1,que[1000][4];
	 memset(que,0,sizeof(que));
	 que[1][0]=sx;que[1][1]=sy;a[sx][sy]=2;
	 while(1){
	 	int zan=0;
	 	for(int i=1;i<=p;i++){
	 		for(int j=0;j<=3;j++){
	 			int X=que[i][0]+fx[j],Y=que[i][1]+fy[j];
	 			if(a[X][Y]==0){
	 				a[X][Y]=2;
	 				zan++;
	 				que[zan][2]=X;
	 				que[zan][3]=Y;
				 }
			 }
		 }
		 if(zan==0) return;
		 p=zan;
		 for(int i=1;i<=p;i++){
		 	que[i][0]=que[i][2];
		 	que[i][1]=que[i][3];
		}
	 }
}
void pan(int x,int y){
	if(flag==true) return;
	if(a[x][y]==0&&(x==n||y==n||x==1||y==1)){
		flag=true;
	} else{
		for(int i=0;i<=3;i++){
			int X=x+fx[i],Y=y+fy[i];
			if(b[X][Y]==false&&X>=1&&X<=6&&Y>=1&&Y<=6){
				b[X][Y]=true;
				pan(X,Y);
				b[X][Y]=false;
			}
		}
	}
	return;
}
void copy(){
	 for(int i=1;i<=n;i++){
	 	for(int j=1;j<=n;j++){
	 		if(a[i][j]==0) b[i][j]=false;
	 		else b[i][j]=true;
		 }
	 }
}
int main(){
	while(cin>>n){
		memset(a,0,sizeof(a));
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j]==0){
				flag=false;
				copy();
				pan(i,j);
				if(flag==false){
					sx=i;sy=j;
					ran();
					print();
					i=n+1;
					break;
			    }
			}
		}
	}}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_32017563/article/details/87716738