zoukankan      html  css  js  c++  java
  • LA 2995 Image Is Everything

    题目链接:

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=996

    题意:

    有一个nnn个不同颜色的单位正方体(每个单位正方体六个面颜色相同)组成的大正方体,现在其中一些单位正方体已经缺失,给定该大正方体的六视图,求这个物体剩下的最大正方体个数。

    分析:

    首先我们假设这个大正方体是满的,然后根据六视图找到对应的立方体块的颜色,如果矛盾,说明该立方体块不在大正方体中。
    不停的判断,遇到矛盾就删除,直到没有矛盾存在,这样剩下的立方体块就是最大的满足条件的立方体块了。
    这里在判断矛盾的时候注意:

    1. 如果视图为’.’,那么该面下面的所有立方体都要删除。
    2. 在遍历六视图进行判断的时候,如果该面没有涂上颜色, 那么我们就假设这个面是表面,把他涂上颜色即可。如果该面已涂的颜色和当前六视图对应面的颜色相同,即不存在矛盾,那么继续判断六视图下一个面。否则,存在矛盾,该立方体删除。

    代码:

    /*************************************************************************
        > File Name: la2995.cpp
        > Author: jiangyuzhu
        > Mail: 834138558@qq.com 
        > Created Time: Sat 18 Jun 2016 05:10:57 PM CST
     ************************************************************************/
    
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<stack>
    using namespace std;
    #define sa(n) scanf("%d", &(n))
    typedef pair<int, int>p;
    const int maxn = 10 + 5, mod = 1e9 + 7, oo = 0x3f3f3f3f;
    char pic[maxn][maxn][maxn];
    char vol[maxn][maxn][maxn];
    int n;
    void get(int k, int i, int j, int dept, int &x, int &y, int &z)
    {
        if(k == 0) x = n - 1 - dept, y = j, z = i; // qian
        if(k == 1) x = j, y = dept, z = i;//zuo
        if(k == 2) x = dept, y = n - 1 - j, z = i;//hou
        if(k == 3) x = n - 1 - j, y = n - 1 - dept, z = i;//you
        if(k == 4) x = i, y = j, z = dept;//ding
        if(k == 5) x = n - 1 - i, y = j, z = n - 1- dept;//di
    }
    int main (void)
    {
        while(~scanf("%d", &n) && n){
        for(int i = 0; i < n; i++){
            for(int k = 0; k < 6; k++){
                for(int j = 0; j < n; j++){
                    char c = getchar();
                    while(c < 'A'|| c > 'Z'){
                        if(c == '.') break;
                        else c = getchar();
                    }
                    pic[k][i][j] = c;
                }
            }
        }
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                for(int z = 0; z < n; z++){
                    vol[i][j][z] = '#';
                }
            }
        }
        int x, y, z;
        for(int k = 0; k < 6; k++){
            for(int i = 0; i < n; i++){
                for(int j = 0; j < n; j++){
                    if(pic[k][i][j] == '.'){
                        for(int m = 0; m < n; m++){
                            get(k, i, j ,m, x, y, z);
                            vol[x][y][z] = '.';
                        }
                    }
                }
            }
        }
        bool found = true;
        while(found){
            found = false;
            for(int k = 0; k < 6; k++){
                for(int i = 0; i < n; i++){
                    for(int j = 0; j < n; j++){
                        if(pic[k][i][j] != '.'){
                            for(int m = 0; m < n; m++){
                                get(k, i, j, m, x, y, z);
                                if(vol[x][y][z] == '.') continue;
                                if(vol[x][y][z] == '#'){
                                    vol[x][y][z] = pic[k][i][j];
                                    break;
                                }
                                if(vol[x][y][z] == pic[k][i][j]) break;
                                vol[x][y][z] = '.';
                                found = true;
                            }
                        }
                    }
                }
            }
        }
        int ans = 0;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                for(int m = 0; m < n; m++){
                    if(vol[i][j][m] != '.') ans++;
                }
            }
        }
        printf("Maximum weight: %d gram(s)
    ", ans);
        }
        return 0;
    }

    这种套路就是,求最大,那我们就先假设是最大的结果,然后不满足就删去,那么剩下的一定是满足的条件中的最大的。。。

  • 相关阅读:
    HDU 1013 Digital Roots
    HDU 1290 献给杭电五十周年校庆的礼物
    几何分割问题
    HDU 1222 Wolf and Rabbit
    HDU 1997 汉诺塔VII
    HDU 1443 Joseph
    HTML的标题样式
    HDU 1568 Fibonacci
    Hope
    HDU 1071 The area
  • 原文地址:https://www.cnblogs.com/Tuesdayzz/p/5758616.html
Copyright © 2011-2022 走看看