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: [email protected] 
    > 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)\n", ans);
    }
    return 0;
}

這種套路就是,求最大,那我們就先假設是最大的結果,然後不滿足就刪去,那麼剩下的一定是滿足的條件中的最大的。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章