题意:
按如图的顺序给定2个骰子的颜色(只有r、b、g三种颜色)
问2个骰子是否一模一样
如
可表示为“rbgggr” 和 “rggbgr”, 第二个就是绕着Z轴顺时针旋转90度与第一个相同的骰子.
分析:
记录一个错误的做法:并不是只要两面两面互相映射, 如rbrggb 与 rgrgbb, 即使 rb 对应 rb、gb 对应 bg、 rg对应rg, 但他们并不是一模一样的骰子。(可以借助真正的骰子旋转尝试一下,就是123456 和 153426, 想象一下2与5互换, 根本不可能从原来的骰子转出来)
正确做法是枚举每一个面向上, 然后分别绕Z轴旋转90度, 每个面有4种情况, 总共24种情况, 再与原来的对应匹配就好, 24个不算太多我就把表打出来了, 其实可以仔细找一下规律, 减少代码量。
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int dir[24][6] = {{1,2,3,4,5,6},{1,4,2,5,3,6},{1,5,4,3,2,6},{1,3,5,2,4,6},{2,1,4,3,6,5},{2,3,1,6,4,5},{2,6,3,4,1,5}, 4 {2,4,6,1,3,5},{3,1,2,5,6,4},{3,5,1,6,2,4},{3,6,5,2,1,4},{3,2,6,1,5,4},{4,1,5,2,6,3},{4,6,2,5,1,3},{4,2,1,6,5,3},{4,5,6,1,2,3}, 5 {5,1,3,4,6,2},{5,6,4,3,1,2},{5,4,1,6,3,2},{5,3,6,1,4,2},{6,2,4,3,5,1},{6,5,3,4,2,1},{6,3,2,5,4,1},{6,4,5,2,3,1}}; 6 char t[100]; 7 bool judge(int kase) 8 { 9 for(int i = 0; i < 6; i++){ 10 if(t[i] != t[dir[kase][i] + 5]) 11 return false; 12 } 13 return true; 14 } 15 int main() 16 { 17 18 while(scanf("%s", &t) != EOF){ 19 int ok = 0; 20 for(int i = 0; i < 24; i++){ 21 if(judge(i)) ok = 1; 22 } 23 printf("%s ", ok? "TRUE":"FALSE"); 24 } 25 return 0; 26 }