题目描述:
由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2。
例子:
填写前:
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
分析:
这道题目找到思路就很简单,从周围四边出发找所有不在圈里面的点,打标记。O(n^2)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
struct add
{
int x,y;
};
int flg[32][32],map[32][32],n;
add queue[304];
int inmp(const int &x,const int &y)
{
return ((x>0)&&(x<=n)&&(y>0)&&(y<=n));
}
void bfs(const int &x,const int &y)
{
int head=0,tail=1,xx,yy;
flg[x][y]=0;
queue[1].x=x;
queue[1].y=y;
while(head<=tail)
{
++head;
for(int i=0;i<4;++i)
{
xx=queue[head].x+dx[i];
yy=queue[head].y+dy[i];
if(inmp(xx,yy))
if(flg[xx][yy] && map[xx][yy]==0)
{
queue[++tail].x=xx;
queue[tail].y=yy;
flg[xx][yy]=0;
}
}
}
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{
scanf("%d",&map[i][j]);
flg[i][j]=1;
}
for(i=1;i<=n;++i)
{
if(map[1][i]==0 && flg[1][i]) bfs(1,i);
if(map[n][i]==0 && flg[n][i]) bfs(n,i);
if(map[i][1]==0 && flg[i][1]) bfs(i,1);
if(map[i][n]==0 && flg[i][n]) bfs(i,n);
}
for(i=1;i<=n;putchar('\n'),++i)
for(j=1;j<=n;++j)
if(map[i][j]) printf("1 ");
else if(flg[i][j]) printf("2 ");
else printf("0 ");
return 0;
}