题意翻译
输入两个骰子,判断二者是否等价。每个骰子用6个字母表示。如第一幅图所示。
例如rbgggr和rggbgr分别表示下面两幅图的两个骰子。两者是等价的,因为图1中所示的骰子沿着竖直轴旋转90°之后就可以得到图2所示的骰子。
输入格式:
12个字母,前6个字母是第一个骰子的六个面;后6个字母是第二个骰子的六个面。
输出格式:
一个布尔值。若两个骰子是等价的,则输出TRUE;反之输出FALSE。
输入输出样例
输入 #1
rbgggrrggbgr
rrrbbbrrbbbr
rbgrbgrrrrrg
输出 #1
TRUE
FALSE
FALSE
思路
思路1:判断两个骰子的3组面是否能一一对应.这个思路可以得到AC代码但是不符合题目要求,如rgbgrbgrgrbb.
思路2:暴力模拟一遍骰子所有旋转后的可能.
代码
思路1
#include <stdio.h>
#include <string.h>
#define maxn 15
struct cube {
char A;
char B;
};
cube left[10];
cube right[10];
char str[maxn];
int main() {
#ifdef LOCAL
freopen("253.out", "w+", stdout);
#endif
while (scanf("%s", str) != EOF) {
for (int i = 0; i < 3; i++) {
left[i].A = str[i];
left[i].B = str[5 - i];
right[i].A = str[6 + i];
right[i].B = str[11 - i];
}
int flag;
int i;
for (i = 0; i < 3; i++) {
if ((left[i].A == right[i].A && left[i].B == right[i].B)) {
continue;
}
flag = 0;
for (int j = i ; j < 3; j++) {
if ((left[i].A == right[j].A && left[i].B == right[j].B) || (left[i].B == right[j].A && left[i].A == right[j].B)) {
flag = 1;
right[j].A = right[i].B;
right[j].B = right[i].A;
right[i] = left[i];
break;
}
}
if (flag) {
continue;
} else {
printf("FALSE\n");
break;
}
}
int x = 1;
if (i == 3) {
for (int m = 0; m < 3; m++) {
if (left[m].A != right[m].A || left[m].B!= right[m].B) {
printf("FALSE\n");
x = 0;
break;
}
}
if (x == 1) {
printf("TRUE\n");
}
}
}
return 0;
}
思路2
#include <stdio.h>
#include <string.h>
#define maxn 15
// 注意面的对应关系
int list[6][6] ={{0,1,2,3,4,5},{1,0,3,2,5,4},{2,0,1,4,5,3},{3,0,4,1,5,2},{4,0,2,3,5,1},{5,1,3,2,4,0}};
char left[maxn];
char right[maxn];
char str[maxn];
int vaild() {
for (int i = 0; i < 6; i++) {
char test[10] ="";
for (int j = 0; j < 6; j++) {
test[j] = left[list[i][j]];
}
test[6] = '\0';
for (int k = 0; k < 4; k++) {
char temp = test[1];
test[1] = test[2];
test[2] = test[4];
test[4] = test[3];
test[3] = temp;
if (strcmp(test, right) == 0) {
return 1;
}
}
}
return 0;
}
int main() {
#ifdef LOCAL
freopen("253.out", "w+", stdout);
#endif
while (scanf("%s", str) != EOF) {
for (int i = 0; i < 6; i++) {
left[i] =str[i];
}
for (int i = 6; i < 12; i++) {
right[i - 6] = str[i];
}
if (vaild()) {
printf("TRUE\n");
} else {
printf("FALSE\n");
}
}
return 0;
}