P1162 填涂颜色
题目描述
由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(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。其中n(1<=n<=30)
接下来n行,由0和1组成的nXn的方阵。
方阵内只有一个闭合圈,圈内至少有一个0。
//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)
输出格式:已经填好数字2的完整方阵。
输入输出样例
输入样例#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<bits/stdc++.h> using namespace std; struct pos { int x; int y; }; bool mark[32][32]; int pic[32][32],dx[]= {0,0,1,-1},dy[]= {1,-1,0,0},n; queue<pos>q; void bfs(int x,int y) { int tx,ty; q.push(pos{x,y}); mark[x][y]=true; while(!q.empty()) { tx=q.front().x; ty=q.front().y; q.pop(); for(int i=0; i<4; i++) { if(tx+dx[i]<0||ty+dy[i]<0||tx+dx[i]>n+1||ty+dy[i]>n+1||mark[tx+dx[i]][ty+dy[i]])continue; q.push(pos{tx+dx[i],ty+dy[i]}); mark[tx+dx[i]][ty+dy[i]]=true; } } } int main() { memset(pic,0,sizeof(pic)); memset(mark,0,sizeof(mark)); cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>pic[i][j]; mark[i][j]=pic[i][j]; } } bfs(0,0); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(mark[i][j])cout<<pic[i][j]<<" "; else cout<<"2"<<" "; } cout<<endl; } }