魔方是一种常见的玩具。2010年7月,美国加利福尼亚州科学家利用计算机证明任意组合的魔方均可以在20步之内还原。作为一个入门级的程序员,我们决定先写一个验证魔方是否复原的程序。对于魔方的一个操作,我们用一个字母来表示。将魔方的一个面正对玩家,就有了前后上下左右六个面,分别用F(Front),B(Back),U(Up),D(Down):,L(Left),R(Right)来表示将这个面顺时针旋转90度,具体玩魔方的时候将右手覆盖到对应的面上,这六个操作时右手的旋转方向都是相同的。同时用X,Y,Z,表示顺时针旋转中间一层,分别对应U,R,F。具体情况可以参照下图(PDF文档中)。与这九个操作对应的还有f,b,u,d,l,r,x,y,z,表示逆时针旋转。
现在我们给出一个操作序列,问在这么旋转之后,魔方是否和原来的时候完全一样。比如UXd被认为是不一样。
输入
输入为一个长度不超过200的字符串,仅包含之上定义的18个字母。
输出
如果能复原,输出Yes,否则输出No。
Sample Input
RUur
Sample Output
Yes
大模拟,自己画一个魔方展开图,然后自己研究一下每次转动到底怎么更新的就行了。
#include<stdio.h>
#include<string.h>
int map[60];
void U(){
int a[60];
int i;
for (i = 0;i < 54;i++)
a[i] = map[i];
map[0] = a[6];map[1] = a[3];map[2] = a[0];map[5] = a[1];map[8] = a[2];map[7] = a[5];map[6] = a[8];map[3] = a[7];
map[51] = a[11];map[52] = a[10];map[53] = a[9];map[27] = a[53];map[28] = a[52];map[29] = a[51];map[18] = a[27];map[19] = a[28];map[20] = a[29];map[9] = a[18];map[10] = a[19];map[11] = a[20];
}
void R()
{
int a[60];
int i;
for (i = 0;i < 54;i++)
a[i] = map[i];
map[27] = a[33];map[28] = a[30];map[29] = a[27];map[32] = a[28];map[35] = a[29];map[34] = a[32];map[33] = a[35];map[30] = a[34];
map[8] = a[26];map[5] = a[23];map[2] = a[20];map[53] = a[8];map[50] = a[5];map[47] = a[2];map[44] = a[53];map[41] = a[50];map[38] = a[47];map[26] = a[44];map[23] = a[41];map[20] = a[38];
}
void F()
{
int a[60];
int i;
for (i = 0;i < 54;i++)
a[i] = map[i];
map[18] = a[24]; map[19] = a[21]; map[20] = a[18]; map[23] = a[19];map[26] = a[20]; map[25] = a[23]; map[24] = a[26];map[21] = a[25];
map[6] = a[17];map[7] = a[14];map[8] = a[11];map[27] = a[6];map[30] = a[7];map[33] = a[8];map[38] = a[27];map[37] = a[30];map[36] = a[33];map[17] = a[38];map[14] = a[37];map[11] = a[36];
}
void D()
{
int a[60];
int i;
for (i = 0;i < 54;i++)
a[i] = map[i];
map[36] = a[42];map[37] = a[39];map[38] = a[36];map[41] = a[37];map[44] = a[38];map[43] = a[41];map[42] = a[44];map[39] = a[43];
map[24] = a[15];map[25] = a[16];map[26] = a[17];map[33] = a[24];map[34] = a[25];map[35] = a[26];map[47] = a[33];map[46] = a[34];map[45] = a[35];map[15] = a[47];map[16] = a[46];map[17] = a[45];
}
void L()
{
int a[60];
int i;
for (i = 0;i < 54;i++)
a[i] = map[i];
map[9] = a[15];map[10] = a[12];map[11] = a[9];map[14] = a[10];map[17] = a[11];map[16] = a[14];map[15] = a[17];map[12] = a[16];
map[0] = a[45];map[3] = a[48];map[6] = a[51];map[18] = a[0];map[21] = a[3];map[24] = a[6];map[36] = a[18];map[39] = a[21];map[42] = a[24];map[45] = a[36];map[48] = a[39];map[51] = a[42];
}
void B()
{
int a[60];
int i;
for (i = 0;i < 54;i++)
a[i] = map[i];
map[45] = a[51];map[46] = a[48];map[47] = a[45];map[50] = a[46];map[53] = a[47];map[52] = a[50];map[51] = a[53];map[48] = a[52];
map[42] = a[9];map[43] = a[12];map[44] = a[15];map[35] = a[42];map[32] = a[43];map[29] = a[44];map[2] = a[35];map[1] = a[32];map[0] = a[29];map[9] = a[2];map[12] = a[1];map[15] = a[0];
}
void X()
{
int a[60];
int i;
for (i = 0;i < 54;i++)
a[i] = map[i];
map[21] = a[30];map[22] = a[31];map[23] = a[32];map[30] = a[50];map[31] = a[49];map[32] = a[48];map[50] = a[12];map[49] = a[13];map[48] = a[14];map[12] = a[21];map[13] = a[22];map[14] = a[23];
}
void Y()
{
int a[60];
int i;
for (i = 0;i < 54;i++)
a[i] = map[i];
map[19] = a[37]; map[22] = a[40]; map[25] = a[43]; map[37] = a[46]; map[40] = a[49]; map[43] = a[52]; map[46] = a[1]; map[49] = a[4]; map[52] = a[7]; map[1] = a[19]; map[4] = a[22]; map[7] = a[25];
}
void Z()
{
int a[60];
int i;
for (i = 0;i < 54;i++)
a[i] = map[i];
map[3] = a[16]; map[4] = a[13]; map[5] = a[10]; map[28] = a[3]; map[31] = a[4]; map[34] = a[5]; map[41] = a[28]; map[40] = a[31]; map[39] = a[34]; map[16] = a[41]; map[13] = a[40]; map[10] = a[39];
}
int main()
{
int l,i;
for (i = 0;i < 54;i++)
map[i] = i;
char ch[500];
scanf("%s", ch);
l = strlen(ch);
for (i = 0;i < l;i++)
{
if (ch[i] == 'F')
{
F();
}
if (ch[i] == 'B')
{
B();
}
if (ch[i] == 'U')
{
U();
}
if (ch[i] == 'D')
{
D();
}
if (ch[i] == 'L')
{
L();
}
if (ch[i] == 'R')
{
R();
}
if (ch[i] == 'X')
{
X();
}
if (ch[i] == 'Y')
{
Y();
}
if (ch[i] == 'Z')
{
Z();
}
if (ch[i] == 'f')
{
F();
F();
F();
}
if (ch[i] == 'b')
{
B();
B();
B();
}
if (ch[i] == 'u')
{
U();
U();
U();
}
if (ch[i] == 'd')
{
D();
D();
D();
}
if (ch[i] == 'l')
{
L();
L();
L();
}
if (ch[i] == 'r')
{
R();
R();
R();
}
if (ch[i] == 'x')
{
X();
X();
X();
}
if (ch[i] == 'y')
{
Y();
Y();
Y();
}
if (ch[i] == 'z')
{
Z();
Z();
Z();
}
}
int flag = 0;
for (i = 0;i < 54;i++)
if (map[i] != i)
flag = 1;
if (flag)
printf("No\n");
else printf("Yes\n");
}