/Files/sixleaves/253.pdf
題目在上面,可以自己下載,這道一開始沒什么思路,后來仔細想想,突然有了點靈感,但是還是找不到比較簡單的辦法
程序還有優化的地步,用到的全局變量有點多。
我的思路是:每個數字都有一個位于Top也就是最頂得時候,只要在這時候,豎直旋轉4次,分別判斷就可以知道是否存在相同的cube了。
程序主體框架挺清晰的,但是有一點就是下標沒處理好,有興趣的,可以自己統一一下。
by sixleaves
1 #include <stdio.h>
2
3 // 枚舉各個數字位于"上"的一種可能情況
4 // 該情況下,各個數字所處的位置
5 int cubeTop[7][7] = {
6 {0,0,0,0,0,0,0},
7 {0,1,2,3,4,5,6},
8 {0,2,6,3,4,1,5},
9 {0,3,2,6,1,5,4},
10 {0,4,2,1,6,5,3},
11 {0,5,1,3,4,6,2},
12 {0,6,5,3,4,2,1}
13 };
14
15
16 int lastCube[7] = {0};
17 int curCube[7] = {0};
18
19 int isFind;
20
21 // [0,6) [6,12)--為另外一個cube
22 char s[15] = {0};
23 void turn();
24 void update();
25 int isSameCube();
26 int main() {
27
28 while (scanf("%s",s) != EOF) {
29
30 // 枚舉top面數字
31 isFind = 0;
32 for (int i = 1; i <=6; i++) {
33
34 // 初始化當前篩子
35 for (int k = 1; k <= 6; k++) {
36 lastCube[k] = curCube[k] = cubeTop[i][k];
37 }
38
39 // 豎直轉動4次篩子
40 for (int j = 0; j < 4; j++) {
41
42 turn();
43
44 if (isSameCube()) {
45 isFind = 1;
46 break;
47 }
48
49 }
50
51 if (isFind) {
52 break;
53 }
54 }
55
56 printf( isFind == 1? "TRUE\n" : "FALSE\n");
57
58 }
59 return 0;
60 }
61
62 int isSameCube() {
63
64 //分別比較對應6個面
65 for (int i = 0; i < 6; i++) {
66 if (s[curCube[i + 1] - 1] != s[i + 6])
67 return 0;
68 }
69 return 1;
70 }
71
72 void turn() {
73
74 curCube[2] = lastCube[3];
75 curCube[4] = lastCube[2];
76 curCube[5] = lastCube[4];
77 curCube[3] = lastCube[5];
78 // 更新lastCube
79 update();
80 }
81
82 void update() {
83
84 lastCube[2] = curCube[2];
85 lastCube[4] = curCube[4];
86 lastCube[5] = curCube[5];
87 lastCube[3] = curCube[3];
88
89 }