/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 }