#include enum DirectionType { TOP, FORWARD, /* 手前 */ RIGHT, LEFT, BACKWARD, /* 奥 */ BOTTOM }; int Direction[24][6] = { {0, 1, 2, 3, 4, 5}, {0, 3, 1, 4, 2, 5}, {0, 4, 3, 2, 1, 5}, {0, 2, 4, 1, 3, 5}, {1, 2, 0, 5, 3, 4}, {1, 5, 2, 3, 0, 4}, {1, 3, 5, 0, 2, 4}, {1, 0, 3, 2, 5, 4}, {2, 5, 4, 1, 0, 3}, {2, 1, 5, 0, 4, 3}, {2, 0, 1, 4, 5, 3}, {2, 4, 0, 5, 1, 3}, {3, 1, 0, 5, 4, 2}, {3, 5, 1, 4, 0, 2}, {3, 4, 5, 0, 1, 2}, {3, 0, 4, 1, 5, 2}, {4, 0, 2, 3, 5, 1}, {4, 3, 0, 5, 2, 1}, {4, 5, 3, 2, 0, 1}, {4, 2, 5, 0, 3, 1}, {5, 1, 3, 2, 4, 0}, {5, 2, 1, 4, 3, 0}, {5, 4, 2, 3, 1, 0}, {5, 3, 4, 1, 2, 0}, }; int Given[6][6]; void Recursive(int DirectionSequence[6], int Length, int Used[6][6], int *Count) { int i, j, Available; if (Length >= 6) { (*Count)++; return; } /* 左から Length 番目 (0-Base) のサイコロについて... */ for (i = 0; i < 24; i++) { /* どの向きにそのサイコロをおいたか */ Available = 1; for (j = 0; j < 6; j++) { /* 向き i に置いたそのサイコロの、各面について */ if (j == LEFT || j == RIGHT) { continue; } /* 今まで置いたサイコロの面 j に、 向き i の Length 番目のサイコロの面 j と同じ、目が出たことがあったら */ if (Used[j][Given[Length][Direction[i][j]]]) { Available = 0; break; } } if (Available) { DirectionSequence[Length] = i; for (j = 0; j < 6; j++) { Used[j][Given[Length][Direction[i][j]]] = 1; } Recursive(DirectionSequence, Length + 1, Used, Count); for (j = 0; j < 6; j++) { Used[j][Given[Length][Direction[i][j]]] = 0; } } } } int main() { int StartDirection, i, j, DirectionSequence[6], Used[6][6], Count; while (1) { for (i = 0; i < 6; i++) { for (j = 0; j < 6; j++) { scanf("%d", &Given[i][j]); if (feof(stdin)) { return 0; } Given[i][j]--; } } Count = 0; for (StartDirection = 0; StartDirection <= 8; StartDirection += 4) { for (i = 0; i < 6; i++) { for (j = 0; j < 6; j++) { Used[i][j] = 0; } } DirectionSequence[0] = StartDirection; for (i = 0; i < 6; i++) { Used[i][Given[0][Direction[StartDirection][i]]] = 1; } Recursive(DirectionSequence, 1, Used, &Count); } printf("%d\n", Count); } return 0; }