题目描述
由数字000组成的方阵中,有一任意形状闭合圈,闭合圈由数字111构成,围圈时只走上下左右444个方向。现要求把闭合圈内的所有空间都填写成222.例如:6×66 \times 66×6的方阵(n=6n=6n=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(1 \le n \le 30)n(1≤n≤30)
接下来nnn行,由000和111组成的n×nn \times nn×n的方阵。
方阵内只有一个闭合圈,圈内至少有一个000。
//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)
输出格式
已经填好数字222的完整方阵。
输入输出样例
输入 #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≤301 \le n \le 301≤n≤30
思路分析
要找到封闭圈内的0,可以直接找到和边界联通的0进行标记,然后剩下的未标记的0就是所要找的封闭圈内的0,主要算法是BFS,利用队列实现BFS搜索,由于博主用的是C语言,所以只能简单用手撸一个队列出来。
直接上代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct elem{
int i,j;
}elem;
typedef struct Queue{
int head;
int rear;
elem data[901];
}Q;
int rect[32][32];
//检测是否超出边界
int check(int i,int j,int n){
if(i<1 || i>n || j<1 || j>n) return 0;
return 1;
}
int main(){
int n;
scanf("%d",&n);
int i,j;
Q q;elem e,*temp;
q.head=q.rear=0;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
scanf("%d",&rect[i][j]);
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(i==1 || j==1 || i==n || j==n){
if(rect[i][j]==0){
e.i=i; e.j=j;
q.data[q.rear] = e;
q.rear += 1;
rect[i][j]=3;
}
}
}
}
while(q.head != q.rear){
//出队列
e = q.data[q.head];
q.head++;
if(rect[e.i][e.j+1]==0 && check(e.i,e.j+1,n)){
temp = (elem*)malloc(sizeof(elem));
rect[e.i][e.j+1]=3;
temp->i = e.i,temp->j = e.j+1;
q.data[q.rear] = *temp;
q.rear++;
//入队列
}
if(rect[e.i+1][e.j]==0&& check(e.i+1,e.j,n)){
temp = (elem*)malloc(sizeof(elem));
rect[e.i+1][e.j]=3;
temp->i = e.i+1,temp->j = e.j;
q.data[q.rear] = *temp;
q.rear++;
}
if(rect[e.i-1][e.j]==0 && check(e.i-1,e.j,n)){
temp = (elem*)malloc(sizeof(elem));
rect[e.i-1][e.j]=3;
temp->i = e.i-1,temp->j = e.j;
q.data[q.rear] = *temp;
q.rear++;
}
if(rect[e.i][e.j-1]==0&& check(e.i,e.j-1,n)){
temp = (elem*)malloc(sizeof(elem));
rect[e.i][e.j-1]=3;
temp->i = e.i,temp->j = e.j-1;
q.data[q.rear] = *temp;
q.rear++;
}
}
//printf("test");
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(rect[i][j]==3) printf("0 ");
else if(rect[i][j]==0) printf("2 ");
else printf("1 ");
}
printf("\n");
}
return 0;
}