题目
题目描述
由数字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。
输出格式
已经填好数字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
题解
1.这个题目我用了DFS,从外围一直判断0,然后不断向里缩,由于DFS的特征,就像走迷宫一样,遇见1,就改变方向,不断搜索。
2.由于不知道图形最外层是否有1,所有为了避免这种情况的出现,所以可以在迷宫最外层加要层,设为0。
3.用于标记的数组在输入时遇见1,改变标记数组的值。
4.DFS中越界或者标记数组不为0时,重新搜索。
代码如下
#include"stdio.h"
int t;
int s[33][33],b[33][33]={0},fx[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y)
{
int xx,yy,i;
if(x<0||y<0||x>t+1||y>t+1||b[x][y]!=0)//越界以及s[n][m]=1的情况
{
return;
}
b[x][y]=1;
for(i=0;i<=3;i++)
{
xx=x+fx[i][0];
yy=y+fx[i][1];
dfs(xx,yy);
}
}
int main()
{
scanf("%d",&t);
int n,m;
for(n=1;n<=t;n++)
{
for(m=1;m<=t;m++)
{
scanf("%d",&s[n][m]);
if(s[n][m]==1)
b[n][m]=2;
}
}
dfs(0,0);
for(n=1;n<=t;n++)
{
for(m=1;m<=t;m++)
{
if(b[n][m]==0)
printf("2 ");
else if(b[n][m]==1)
printf("0 ");
else
printf("1 ");
}
printf("\n");
}
return 0;
}