开始的想法:骰子无论怎么转,每个数字和其对面的数字的对应关系永远不会改变,所以只需要比较两个骰子的三对数字是否相同即可,也的确AC了,但是后来想想不太对。
#include#include using namespace std;char s[12];int vis[3];int main(){ while(scanf("%s",s) != EOF){ int i,j; memset(vis,0,sizeof(vis)); for(i = 0;i < 3;i++){ for(j = 6;j < 9;j++){ if(!vis[j-6] && ((s[i] == s[j] && s[5-i] == s[11-j+6]) || (s[i] == s[11-j+6] && s[5-i] == s[j]))){ vis[j-6] = 1; break; } } if(j == 9){ printf("FALSE\n"); break; } } if(i == 3) printf("TRUE\n"); } return 0;}
比如上图这种情况,虽然三组数字都对应相同,但是两个骰子明显是不一样的,所以只考虑三组数字是无法保证正确的,题目的测试数据不行啊。。。
新的想法:对于第二个骰子,首先确定其与第一个骰子第一个面所对应的面,即确定旋转轴;然后尝试四种可能的旋转情况(逆时针顺序比较四个相邻字母),依次比较两个骰子与第一个面相邻的四个面的字母是否对应相等,如果全部对应那么两枚骰子就是相同的。代码如下:
#include#include using namespace std;int cons[6][4] = { {5,4,2,3},{1,4,6,3},{1,2,6,5},{1,5,6,2},{1,3,6,4},{5,3,2,4}};char s[12];int main(){ while(scanf("%s",s) != EOF){ int i,j,k; for(i = 6;i < 12;i++){ if(s[i] == s[0] && s[6+11-i] == s[5]){ for(j = 0;j < 4;j++){ int t = i - 6,cnt = 0,tc = j; for(k = 0;k < 4;k++){ if(s[cons[0][k] - 1] == s[6 + cons[t][(tc++)%4] - 1]) cnt++; } if(cnt == 4) break; } if(j < 4) break; } } printf("%s\n",i < 12 ? "TRUE" : "FALSE"); } return 0;}