UAV--253 Cube painting,骰子涂色——模拟



题意:给两个有红(r)蓝(b)绿(g)三种颜色的骰子,连接的面可以是一种颜色,判断这两个骰子是不是同一种骰子,即个个对应面是否相同。输入形式为:上前左右后下(对应面的颜色)。
思路:骰子通过不同方式的旋转可以有的结果有限且不大,每个面朝上时可以有四种不同的方式旋转,一共有6*4=24种情况,所以可以采用枚举的方法,以其中一个(代码是默认是以第一个骰子)骰子所能产生的所有结果和第二个进行比较,如果有相同的情况,即两个骰子等价。
#include <bits/stdc++.h>
using namespace std;
/*freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);*/
#define ll long long
#define maxc 10010
#define mod 7
char a[10];//原数组
char v[10];//比较数组
int d[6][6] = { { 0, 1, 2, 3, 4, 5 }, //上前左右后下
{ 1, 0, 3, 2, 5, 4 },
{ 2, 0, 1, 4, 5, 3 },
{ 3, 1, 0, 5, 4, 2 },
{ 4, 2, 0, 5, 3, 1 },
{ 5, 2, 1, 4, 3, 0 }};
int bh(){
for(int i=0;i<6;i++){
char s[10];//变换数组
memset(s,0,sizeof(s));
for(int j=0;j<6;j++)
s[j]=a[d[i][j]];
for(int j=0;j<4;j++){
char k;//上前左右后下
k=s[1];
s[1]=s[2];
s[2]=s[4];
s[4]=s[3];
s[3]=k;
if(strcmp(s,v)==0)//strcmp函数,两字符串相等返回0
return 1;
}
}
return 0;
}
int main()
{
char s;
/*freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);*/
while(~scanf("%c",&s)){
memset(a,0,sizeof(a));
memset(v,0,sizeof(v));
a[0]=s;
for(int i=1;i<6;i++)
scanf("%c",&a[i]);
for(int i=0;i<6;i++)
scanf("%c",&v[i]);
getchar();
if(bh())
cout<<"TRUE"<<endl;
else
cout<<"FALSE"<<endl;
}
return 0;
}