洛谷OJ P1162填涂颜色

来源:互联网 发布:妄想代理人知乎 编辑:程序博客网 时间:2024/05/01 14:09

题目描述:
由数字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;}
0 0
原创粉丝点击