UVA 253 Cube painting(枚举 模拟)

题意:

按如图的顺序给定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 }
原文地址:https://www.cnblogs.com/Jadon97/p/7147173.html