【广度搜索】填涂颜色
题目描述
由数字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;
}