填涂颜色
题目描述
由数字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。
输出格式:
已经填好数字22的完整方阵。
输入输出样例
输入样例#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
算法:宽搜
#include<iostream> #include<algorithm> #include<vector> #include<queue> using namespace std; typedef pair<int,int> PII; const int N=32; int g[N][N],n; int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; void bfs(int x, int y){ queue<PII>q; q.push({x+1,y+1}); g[x+1][y+1]=2; while(q.size()){ auto t=q.front(); q.pop(); for(int i=0;i<4;i++){ int nx=t.first+dx[i],ny=t.second+dy[i]; if(!g[nx][ny]&&nx>=0&&nx<n&&ny>=0&&ny<n){ g[nx][ny]=2; q.push({nx,ny}); } } } } int main(void){ cin>>n; bool flag=false; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>g[i][j]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(g[i][j]==1){ flag=true; bfs(i,j); break; } } if(flag)break; } for(int i=0;i<n;i++){ for(int j=0;j<n;j++) cout<<g[i][j]<<' '; cout<<endl; } return 0; }