• UVALive 4997 ABCD Tiles --DFS


    题意: NxN的地图,上面有A颜色的瓷砖以及一些空格点,要用B,C,D颜色去填充这些空格,只能十字形的填充,还要保证共角或共边的格子不能是相同颜色,求一种字典序最小的填充方法,如果不能,输出"Not Possible"。

    解法: 从上往下扫,如果有空格,那么一定是以它下面那个格子为中心填十字瓷砖才能填到这个空格,所以这个我们将这个空格标个号,并且把下面的三个和下下面的一个空格赋一下别的值,不让以后扫描扫到,那些不是空格的话,直接跳出即可。这样我们可以找到所有需要填的十字形瓷砖个数,并且知道格子的位置,那么接下来只要考虑染什么色的事情了,因为只有三种颜色,所以dfs去填即可,如果到某一状态发现哪种颜色都不能填,那么回溯。这样一直到成功找到染色方案位置。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    
    char mp[20][20];
    int n,tot;
    int col[4];
    bool OK(int x,int y) { return x >= 0 && x < n && y >= 0 && y < n; }
    bool findcolor(int i,int j,char ch) {
        memset(col,0,sizeof(col));
        if(OK(i+1,j+1) && mp[i+1][j+1] != '.') col[mp[i+1][j+1]-'A']++;
        if(OK(i+1,j-1) && mp[i+1][j-1] != '.') col[mp[i+1][j-1]-'A']++;
        if(OK(i-1,j-1) && mp[i-1][j-1] != '.') col[mp[i-1][j-1]-'A']++;
        if(OK(i-1,j+1) && mp[i-1][j+1] != '.') col[mp[i-1][j+1]-'A']++;
        for(int k=j-1;k<=j+1;k++) if(OK(i+2,k) && mp[i+2][k] != '.') col[mp[i+2][k]-'A']++;
        for(int k=i-1;k<=i+1;k++) if(OK(k,j+2) && mp[k][j+2] != '.') col[mp[k][j+2]-'A']++;
        for(int k=j-1;k<=j+1;k++) if(OK(i-2,k) && mp[i-2][k] != '.') col[mp[i-2][k]-'A']++;
        for(int k=i-1;k<=i+1;k++) if(OK(k,j-2) && mp[k][j-2] != '.') col[mp[k][j-2]-'A']++;
        if(col[ch-'A']) return true;
        return false;
    }
    void color(int i,int j,char ch) {
        mp[i][j] = mp[i-1][j] = mp[i][j+1] = mp[i+1][j] = mp[i][j-1] = ch;
    }
    struct node {
        int x,y;
        node(int _x,int _y):x(_x),y(_y){}
        node(){}
    }p[255];
    
    bool dfs(int c) {
        if(c == tot) return true;
        c++;
        int x = p[c].x, y = p[c].y;
        for(int i=1;i<=3;i++) {   //B,C,D
            if(!findcolor(x,y,'A'+i)) {    //周边有没有'A'+i这种颜色
                color(x,y,'A'+i);
                if(dfs(c)) return true;
                color(x,y,'.');
            }
        }
        return false;
    }
    
    int main()
    {
        int t,cs = 1,i,j,k,h;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            int space = 0;
            for(i=0;i<n;i++)
                scanf("%s",mp[i]);
            int flag = 1;
            tot = 0;
            for(i=0;i<n;i++) {
                for(j=0;j<n;j++) {
                    if(mp[i][j] == '.') {
                        for(k=j-1;k<=j+1;k++) {
                            if(!OK(i+1,k) || mp[i+1][k] != '.') { flag = 0; break; }
                            else mp[i+1][k] = '#';
                        }
                        if(!OK(i+2,j) || mp[i+2][j] != '.') { flag = 0; break; }
                        else mp[i+2][j] = '#';
                        p[++tot] = node(i+1,j);   //着色中心点
                    }
                }
            }
            printf("Case %d:",cs++);
            if(!flag) { puts(" Not Possible!"); continue; }
            if(dfs(0)) {
                puts("");
                for(i=0;i<n;i++)
                {
                    for(j=0;j<n;j++)
                        printf("%c",mp[i][j]);
                    puts("");
                }
            }
            else puts(" Not Possible!");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    SpringBoot获取配置文件,就这么简单。
    IDEA 插件推荐 —— 让你写出好代码的神器!
    太高效了!玩了这么久的Linux,居然不知道这7个终端快捷键!
    万字长文!一次性弄懂 Nginx 处理 HTTP 请求的 11 个阶段
    一个排查了大半天儿的问题,差点又让 MyBatis 背锅
    使用Flutter开发的抖音国际版
    一文回顾Redis五大对象(数据类型)
    Gradle系列之初识Gradle
    OpenJFX DJ 风格 Java 桌面音乐播放器
    【高并发】高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!
  • 原文地址:https://www.cnblogs.com/whatbeg/p/4232097.html
Copyright © 2020-2023  润新知