2011-09-11 22:46:55Morris

d650. 好多骰子

d650. 好多骰子

內容 :

今天可愛的小涵製作了好多骰子,每個骰子都是 正立方體,骰子的每個面上面都有一些小圓點(至少一個),圓點的個數表示骰子該面的點數。但是她製作完成後,發現雖然有些骰子由某個角度看起來不相同,但 經過旋轉後,就是相同的骰子了。(只要骰子經過旋轉後與另一骰子的各相對位置點數相同,就視為相同的骰子,也就是說不考慮點數排列形狀的方向性。)

小涵想要知道,在她所製作的骰子中,有幾種不相同的骰子呢?

輸入說明 :

輸入資料第一行有一個正整數n,表示小涵共製作了幾個骰子。

接 著共有n行,每行表示一顆骰子的點數,依序有六個正整數a,b,c,d,e,f,表示該位置的小圓點數,如圖所示,其中,d位於圖中a所在位置的對面,e 位於圖中b所在位置的對面,f位於圖中c所在位置的對面。(n<=1000000,0<a,b,c,d,e,f<2^31)

輸出說明 :

輸出小涵共製作了幾種不相同的骰子。

範例輸入 :

5
8 4 5 2 9 8
1 2 4 5 8 9
1 8 4 5 9 2
5 2 9 1 8 4
1 2 3 4 5 6

範例輸出 :

4

提示 :

在範例輸入中,其中1 2 4 5 8 9與5 2 9 1 8 4為同種骰子,其餘均不同種。

出處 :

(管理:magrady)



作法 : 旋轉骰子後, 找一個序列最小的儲存, 之後用排序, 再檢查重覆

/**********************************************************************************/
/*  Problem: d650 "好多骰子" from                                             */
/*  Language: C                                                                   */
/*  Result: AC(192ms, 3.8MB) judge by this@ZeroJudge                              */
/*  Author: morris1028 at 2011-09-11 19:50:04                                     */
/**********************************************************************************/


#include<stdio.h>
#include<stdlib.h>
typedef struct {
    int dice[6];
}DICE;
void Right_turn(DICE *A) {
    static int t;
    t = A->dice[0], A->dice[0] = A->dice[4];
    A->dice[4] = A->dice[3], A->dice[3] = A->dice[1], A->dice[1] = t;
}
void Up_turn(DICE *A) {
    static int t;
    t = A->dice[0], A->dice[0] = A->dice[5];
    A->dice[5] = A->dice[3], A->dice[3] = A->dice[2], A->dice[2] = t;
}
void clockwise(DICE *A) {
    static int t;
    t = A->dice[2], A->dice[2] = A->dice[4];
    A->dice[4] = A->dice[5], A->dice[5] = A->dice[1], A->dice[1] = t;
}
DICE Data[1000000];
int cmp(const void *a, const void *b) {
    static DICE *i, *j;
    static int k;
    i = (DICE *)a, j = (DICE *)b;
    for(k = 0; k < 6; k++)
        if(i->dice[k] != j->dice[k])
            return i->dice[k] - j->dice[k];
    return 0;
}
void Print(DICE A) {
    static int i;
    for(i = 0; i < 6; i++)
        printf("%d ", A.dice[i]);
    puts("");
}
void Spin_dice(DICE A, int store) {
    static int i, j;
    for(i = 0; i < 6; i++)
        Data[store].dice[i] = A.dice[i];
    for(i = 0; i < 4; i++) {
        for(j = 0; j < 4; j++) {
            if(cmp(&Data[store], &A) > 0)
                Data[store] = A;
            clockwise(&A);
        }        
        Right_turn(&A);
    }
    Up_turn(&A);
    for(i = 0; i < 2; i++) {
        for(j = 0; j < 4; j++) {
            if(cmp(&Data[store], &A) > 0)
                Data[store] = A;
            clockwise(&A);
        }        
        Up_turn(&A), Up_turn(&A);
    }
}
main() {
    int n, i, j;
    DICE A;
    A.dice[0] = 5, A.dice[1] = 2, A.dice[2] = 9;
    A.dice[3] = 1, A.dice[4] = 8, A.dice[5] = 4;
    Spin_dice(A, 0);
    while(scanf("%d", &n) == 1) {
        for(i = 0; i < n; i++) {
            for(j = 0; j < 6; j++)
                scanf("%d", &A.dice[j]);
            Spin_dice(A, i);
        }
        int Ans = 1;
        qsort(Data, n, sizeof(DICE), cmp);
        for(i = 1; i < n; i++) {
            if(cmp(&Data[i], &Data[i-1]))
                Ans++;
        }
        printf("%d\n", Ans);
    }
    return 0;
}