【广度搜索】填涂颜色

【广度搜索】填涂颜色

题目

题目描述

由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。
现要求把闭合圈内的所有空间都填写成2.例如:
\6×6的方阵(n=6),涂色前和涂色后的方阵如下:

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

输入格式

每组测试数据第一行一个整数n(1≤n≤30)

接下来n行,由0和1组成的n×n的方阵
方阵内只有一个闭合圈,圈内至少有一个0。

输入输出样例

输入 #1 复制
6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
输出 #1 复制
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

说明/提示
1≤n≤30

解法:

题要把 被1包围着的0变成2.其他0不变。然后输出。。。

首先要假设方阵外围还有一圈0,然后从最左上角那个0开始搜。 又不然很难找到一个不是1包围外的0开始搜。
然后没然后了。。。开始广搜。

#include<iostream>

using namespace std;
#include<queue>

int n;
int maze[35][35];
bool vis[35][35];
int dir[4][2] = {{0,1},{-1,0},{0,-1},{1,0} };

bool in(int x,int y){
	return 0<=x && x<=n+1 &&0<=y && y<=n+1;
}
queue<pair<int,int> > q;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>maze[i][j];
		}
	}
	//for(int i=1;i<=n;i++){
//		for(int j=1;j<=n;j++){
//			cout<<maze[i][j]<<" ";
//		}
//		cout<<endl;
//	}
	q.push(make_pair(0,0));
	vis[0][0]= true;
	while(!q.empty()){
		for(int i=0;i<4;i++){
			int tx = q.front().first + dir[i][0];
			int ty = q.front().second + dir[i][1];
			if(in(tx,ty) &&maze[tx][ty] == 0 && !vis[tx][ty]){
				vis[tx][ty] =true;
				q.push(make_pair(tx,ty));
			}
		}
		q.pop();	
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(maze[i][j]== 0 && !vis[i][j]){
				cout<<2<<" ";
			}else{
				cout<<maze[i][j]<<" ";
			}
		}
		cout<<endl;
	}
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值