题解 UVA11520 【Fill the Square】

又是一道蓝书上的题呢。

楼下的咋是直接抄蓝书的啊,我觉得吧做题要有自己的思想,我看到这道题,第一个想的就是bfs。大概就是直接搜每一个点。

  • 如果这个点本来就有字母,那就直接把这个字符存入答案

  • 否则从$'A'$到$'Z'$枚举,如这个点四周没有相同的字符就把这个字符存入答案,然后直接break,因为要字典序最小的,而因为是从$'A'$到$'Z'$枚举,所以每次先找到的可行解一定是字典序最小的

CODE(STL实现)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>

using std::queue;
using std::cin;
using std::cout;
using std::ios;
const int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
int n,T;
int vis[3242][3422];
char map[324][234];
char ans[324][234];

inline bool in_side(int x,int y)
{
    return (x>0 && x<=n && y>0 && y<=n);
}

inline bool check(int x,int y,char xs)
{
    int ok=1;
    for(int i=0; i<4; i++)
    {
        int sx=x+dx[i],sy=y+dy[i];
        if(in_side(sx,sy) && (ans[sx][sy] == xs))
        {
            ok=0;
            break;
        }
    }
    return ok;
}
struct node
{
    int x,y;
};

inline void bfs(int x,int y)
{
    queue<node> Q;
    Q.push({x,y});
    while(!Q.empty())
    {
        node fr=Q.front();
        Q.pop();
        if(ans[fr.x][fr.y] == '.')
        {
            for(int ch='A'; ch<='Z'; ch++)
            {
                if(check(fr.x,fr.y,ch))
                {
                    ans[fr.x][fr.y]=ch;
                    break;
                }
            }
        }

        for(int i=0; i<4; i++)
        {
            int sx=fr.x+dx[i],sy=fr.y+dy[i];
            if(in_side(sx,sy) && !vis[sx][sy])
            {
                vis[sx][sy]=1;
                Q.push({sx,sy});
            }
        }
       // printf("ans[%d][%d]=%c\n",fr.x,fr.y,ans[fr.x][fr.y]);
    }

}

int main()
{
    scanf("%d",&T);  
    for(int Case=1; Case<=T; Case++)
    {
        memset(vis,0,sizeof vis);
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                cin>>map[i][j];
                ans[i][j]=map[i][j];
            }
        }
        vis[1][1]=1;
        bfs(1,1);
        printf("Case %d:\n",Case);
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                printf("%c",ans[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}
posted @ 2018-12-07 23:00  加固文明幻景  阅读(4)  评论(0编辑  收藏  举报  来源