由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向。现要求把闭合圈内的所有空间都填写成22.例如:6 \times 66×6的方阵(n=6n=6),涂色前和涂色后的方阵如下:
0 0 0 0 0 00 0 1 1 1 10 1 1 0 0 11 1 0 0 0 11 0 0 0 0 11 1 1 1 1 1
0 0 0 0 0 00 0 1 1 1 10 1 1 2 2 11 1 2 2 2 11 2 2 2 2 11 1 1 1 1 1
输入输出格式
输入格式:
每组测试数据第一行一个整数n(1 \le n \le 30)n(1≤n≤30)
接下来nn行,由00和11组成的n \times nn×n的方阵。
方阵内只有一个闭合圈,圈内至少有一个00。
输出格式:
已经填好数字22的完整方阵。
输入输出样例
输入样例#1: 复制
60 0 0 0 0 00 0 1 1 1 10 1 1 0 0 11 1 0 0 0 11 0 0 0 0 11 1 1 1 1 1
输出样例#1: 复制
0 0 0 0 0 00 0 1 1 1 10 1 1 2 2 11 1 2 2 2 11 2 2 2 2 11 1 1 1 1 1
说明
1≤n≤30
思路:我的思路是先将四周包上一层0,这样就可以搜索到每个地方,一道偏模板的广搜,看代码应该可以理解。
#include#include #include #include #include #include using namespace std;int a[35][35],b[35][35],n,dx,dy;int d[2][4]={ {1,-1,0,0},{0,0,1,-1}};struct node{ int r,c;};void BFS(){ node m; queue q; m.c=0,m.r=0; q.push(m); while(!q.empty()) { node front=q.front(); q.pop(); for(int i=0;i<4;++i) { dx=front.r+d[0][i]; dy=front.c+d[1][i]; if(dx>=0 && dx<=n+1 && dy>=0 && dy<=n+1 && a[dx][dy]==0) { a[dx][dy]=-1; node m1; m1.r=dx,m1.c=dy; q.push(m1); } } }}int main(){ scanf("%d",&n); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) scanf("%d",&a[i][j]); for(int i=0;i<=n+1;++i) { a[0][i]=0; a[n+1][i]=0; a[i][0]=0; a[i][n+1]=0; } BFS(); for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { if(a[i][j]==-1) printf("0 "); else if(a[i][j]==0) printf("2 "); else printf("%d ",a[i][j]); } printf("\n"); } return 0;}