程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj1022:Packing Unit 4D Cubes四維魔方的題意和題解

poj1022:Packing Unit 4D Cubes四維魔方的題意和題解

編輯:C++入門知識

囧,題意看起來 很復雜,故幾乎沒什麼人提交,其實只要看懂了題目的意思再簡單不過了,,,這不,因為英語不好花了很久才看懂題意,稍微解釋一下吧:
定義一個四維的魔方,每個四維的魔方有八個面(類比3維的魔方有六個面),每個面是一個3維的東西(類比3維的魔方的每個面是2維的平面)。
然後要把n個四維的魔方包裝起來,因為是四維的,所以有四根坐標軸,每個魔方給出9個數據,第一個是此魔方的標識,然後1,2個表示在沿著第一根軸的前面和後面的用膠水
粘貼起來的魔方的編號,沒有便為0。然後要你計算這n個四維魔方組裝成的EER的“體積”(體積是相對與四維而言的)。理解了題意就簡單了,直接由3維的外推到4維,3維裡怎
麼做在四維裡就怎麼做。如:體積等於每個坐標軸的距離乘起來。反正按3維的思考方法來就是了。
然後有兩個判斷:1是如果x在y上面那y必在x下面,如不成立則不存在。
                        2是最後只能組裝城一個產品,不是多個,dfs求連通分量即可
AC代碼如下:(第一次以為魔方的標識符在1到n之間,其實不是,搞得re了幾次)

[cpp] 
# include <stdio.h> 
# include <string.h> 
# include <stdlib.h> 
# define get(x) (((x-1)&((1 << 31) - 2)+((x-1)&1)^1)+1) 
# define DEBUG 
 
int s[111][11]; 
int use[111]; 
int check[111]; 
int re[111]; 
 
int go(int x, int n) { 
    for (int i = 1; i <= n; ++ i){ 
        if(re[i] == x) return i; 
    } 

 
int check1(int n) { 
    for (int i = 1; i <= n; ++ i) { 
        for (int j = 1; j <= 8; ++ j) { 
            if (s[i][j] && s[go(s[i][j], n)][get(j)] != re[i]) return 1; 
        } 
    } 
    return 0; 

 
int dfs(int x, int n) { 
    if(check[x]) return 0; 
    check[x] = 1; 
    for (int i = 1; i <= 8; ++ i) { 
        if(s[x][i]) { 
            int t = go(s[x][i], n); 
            use[t] = 1; 
            dfs(t,n); 
        } 
    } 
    return 0; 

 
int check2(int n, int x) { 
    dfs(x,n); 
    for (int i = 1; i <= n; ++ i) { 
        if (!use[i]) return 1; 
    } 
    return 0; 

 
int getAns(int n) { 
    int x[5]; 
    memset(x, 0, sizeof(x)); 
    for (int i = 1; i <= n; ++ i) { 
        for (int j = 1; j <= 8; ++ j) { 
            if(s[i][j]) { 
                ++ x[(j + 1) >> 1]; 
            } 
        } 
    } 
    int su = 1; 
    for (int i = 1; i <= 4; ++ i) { 
        su *= (x[i] >> 1) + 1; 
    } 
    printf ("%d\n", su); 
    return 0; 

 
int main () { 
    int ts; 
    for (scanf("%d", &ts); ts; -- ts) { 
        int n; 
        scanf("%d", &n); 
        memset(s, 0, sizeof(s)); 
        memset(use, 0, sizeof(use)); 
        memset(check, 0, sizeof(check)); 
        memset(re, 0, sizeof(re)); 
        int t; 
        for (int i = 1; i <= n; ++ i) { 
            scanf("%d", &t); 
            re[i] = t; 
            s[i][0] = t; 
            for (int j = 1; j <= 8; ++ j) { 
                scanf("%d", &s[i][j]); 
            } 
        }   www.2cto.com
        //printf ("%d %d", check1(n), check2(n, t)); 
        if(check1(n) || check2(n, 1)) { 
            printf ("Inconsistent\n"); 
        } 
        else { 
            getAns(n); 
        } 
    } 
 
 
 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved