直接模拟就行了。
我的方法似乎比其他题解麻烦(傻瓜式做法),但逻辑简单,容易理解。
用一个结构体来存骰子的每一个面的相邻面。
char a[7], b[7];
struct node{
char s;
char b[5];
}an[7], bn[7];
an[1].s = a[1], an[1].b[1] = a[2], an[1].b[2] = a[3], an[1].b[3] = a[4], an[1].b[4] = a[5];
an[2].s = a[2], an[2].b[1] = a[1], an[2].b[2] = a[3], an[2].b[3] = a[4], an[2].b[4] = a[6];
an[3].s = a[3], an[3].b[1] = a[1], an[3].b[2] = a[2], an[3].b[3] = a[5], an[3].b[4] = a[6];
...省略9行(两个数组类似)
然后排序,
先把每个面的相邻面排序,
再把面排序。
最后比较两个数组,判断输出就行了。
注意 UVA 的多组数据。
AC 完整代码
#include <bits/stdc++.h>
using namespace std;
char a[7], b[7];
struct node{
char s;
char b[5];
}an[7], bn[7];
void mmst() { //初始化是个好习惯
for(int i = 1; i <= 6; i++) {
a[i] = ' ', b[i] = ' ';
for(int j = 1; j <= 4; j++) an[i].b[j] = ' ', bn[i].b[j] = ' ';
}
}
bool cmp(node x, node y) { //较为保险的比较函数
if(x.s == y.s) {
if(x.b[1] == y.b[1]) {
if(x.b[2] == y.b[2]) {
if(x.b[3] == y. b[3]) {
if(x.b[4] == y.b[4]) {
if(x.b[5] == y.b[5]) return x.b[6] < y.b[6];
else return x.b[5] < y.b[5];
}else return x.b[4] < y.b[4];
}else return x.b[3] < y.b[3];
}else return x.b[2] < y.b[2];
}else return x.b[1] < y.b[1];
}
return x.s < y.s;
}
bool check() {
an[1].s = a[1], an[1].b[1] = a[2], an[1].b[2] = a[3], an[1].b[3] = a[4], an[1].b[4] = a[5];
an[2].s = a[2], an[2].b[1] = a[1], an[2].b[2] = a[3], an[2].b[3] = a[4], an[2].b[4] = a[6];
an[3].s = a[3], an[3].b[1] = a[1], an[3].b[2] = a[2], an[3].b[3] = a[5], an[3].b[4] = a[6];
an[4].s = a[4], an[4].b[1] = a[1], an[4].b[2] = a[2], an[4].b[3] = a[5], an[4].b[4] = a[6];
an[5].s = a[5], an[5].b[1] = a[1], an[5].b[2] = a[3], an[5].b[3] = a[4], an[5].b[4] = a[6];
an[6].s = a[6], an[6].b[1] = a[2], an[6].b[2] = a[3], an[6].b[3] = a[4], an[6].b[4] = a[5];
bn[1].s = b[1], bn[1].b[1] = b[2], bn[1].b[2] = b[3], bn[1].b[3] = b[4], bn[1].b[4] = b[5];
bn[2].s = b[2], bn[2].b[1] = b[1], bn[2].b[2] = b[3], bn[2].b[3] = b[4], bn[2].b[4] = b[6];
bn[3].s = b[3], bn[3].b[1] = b[1], bn[3].b[2] = b[2], bn[3].b[3] = b[5], bn[3].b[4] = b[6];
bn[4].s = b[4], bn[4].b[1] = b[1], bn[4].b[2] = b[2], bn[4].b[3] = b[5], bn[4].b[4] = b[6];
bn[5].s = b[5], bn[5].b[1] = b[1], bn[5].b[2] = b[3], bn[5].b[3] = b[4], bn[5].b[4] = b[6];
bn[6].s = b[6], bn[6].b[1] = b[2], bn[6].b[2] = b[3], bn[6].b[3] = b[4], bn[6].b[4] = b[5];
for(int i = 1; i <= 6; i++)
sort(an[i].b + 1, an[i].b + 5), sort(bn[i].b + 1, bn[i].b + 5);
sort(an + 1, an + 7, cmp);
sort(bn + 1, bn + 7, cmp);
for(int i = 1; i <= 6; i++) for(int j = 1; j <= 4; j++)
if(an[i].b[j] != bn[i].b[j]) return false;
return true;
}
int main() {
string str;
while(cin >> str) {
mmst();
for(int i = 0; i <= 5; i++) a[i + 1] = str[i];
for(int i = 6; i <= 11; i++) b[i - 5] = str[i];
if(check()) printf("TRUE\n");
else printf("FALSE\n");
}
return 0;
}