题目描述

由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下:

0 0 0 0 0 0 0 0 0 0 0 0

0 0 1 1 1 1 0 0 1 1 1 1

0 1 1 0 0 1 0 1 1 2 2 1

1 1 0 0 0 1 1 1 2 2 2 1

1 0 0 0 0 1 1 2 2 2 2 1

1 1 1 1 1 1 1 1 1 1 1 1

输入输出格式

输入格式:

每组测试数据第一行一个整数:n。其中n(1<=n<=30)

接下来n行,由0和1组成的nXn的方阵。

方阵内只有一个闭合圈,圈内至少有一个0。

输出格式:

已经填好数字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<iostream>
#include<cstdio>
using namespace std;
int n;
bool a[][],z[][];
void dfs(int y,int x){
if(a[y][x]||z[y][x]||x<||x>n||y<||y>n)//此句保证了a中是除了边界和内部都变为1
return;
a[y][x]=;
dfs(y,x+); dfs(y+,x); dfs(y,x-); dfs(y-,x);//扩展各个方向
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
scanf("%d",&z[i][j]);
}
}
for(int i=;i<=n;i++){
dfs(,i);
dfs(n,i);
}
for(int i=;i<=n-;i++){
dfs(i,);
dfs(i,n);
}
for(int i=;i<=n;i++,puts("")){
for(int j=;j<=n;j++){
if(z[i][j])
printf("1 ");//先判断是否是边界,是就输出
else
printf("%d ",a[i][j]?:);//dfs后的a外部是1,输出0,内部是0,输出2,
//边界上边已经判断了,不考虑
}
}
return ;
}
04-18 20:59