问题描述
魔方是一种常见的玩具。2010年7月,美国加利福尼亚州科学家利用计算机证明任意组合的魔方均可以在20步之内还原。作为一个入门级的程序员,我们决定先写一个验证魔方是否复原的程序。对于魔方的一个操作,我们用一个字母来表示。将魔方的一个面正对玩家,就有了前后上下左右六个面,分别用F(Front),B(Back),U(Up),D(Down):,L(Left),R(Right)来表示将这个面顺时针旋转90度,具体玩魔方的时候将右手覆盖到对应的面上,这六个操作时右手的旋转方向都是相同的。同时用X,Y,
Z,表示顺时针旋转中间一层,分别对应U,R,F。具体情况可以参照下图。与这九个操作对应的还有f,b,u,d,l,r,x,y,z,表示逆时针旋转。
现在我们给出一个操作序列,问在这么旋转之后,魔方是否和原来的时候完全一样。比如UXd被认为是不一样。
输入为一个长度不超过200的字符串,仅包含之上定义的18个字母。
如果能复原,输出Yes,否则输出No。
整体思路:
就是进行大型的模拟,利用子函数对魔方的各个小块进行操作,最后得到的魔方与刚开始的魔方对比,如果一模一样就说明可以实现复原,如果不是一模一样就说明不可以实现复原。
具体实现:
根据个人的喜好,可以设置一个一维或是二维的数组来记录开始时候每个魔方54个小块的状态。然后编写9个子函数,表示每一种具体的操作,(逆时针旋转一次相当于顺时针旋转3次,所以只需要写9个子函数)。在写子函数的时候一定要小心,千万不要把里面的赋值语句写错了,争取一遍写好。要不然找BUG的时候会比再写一次更难受。
实现代码
<span style="font-family:Microsoft YaHei;font-size:14px;">#include<stdio.h>
#include<string.h>
void U(int *a)
{
int temp1,temp2,temp3,temp4,temp5;
temp1=a[0];
temp2=a[1];
temp3=a[2];
temp4=a[42];
temp5=a[43];
a[0]=a[27];
a[27]=a[11];
a[11]=a[18];
a[18]=temp1;
a[1]=a[28];
a[28]=a[10];
a[10]=a[19];
a[19]=temp2;
a[2]=a[29];
a[29]=a[9];
a[9]=a[20];
a[20]=temp3;
a[42]=a[44];
a[44]=a[38];
a[38]=a[36];
a[36]=temp4;
a[43]=a[41];
a[41]=a[37];
a[37]=a[39];
a[39]=temp5;
}
void R(int *a)
{
int temp1,temp2,temp3,temp4,temp5;
temp1=a[2];
temp2=a[5];
temp3=a[8];
temp4=a[27];
temp5=a[28];
a[2]=a[53];
a[53]=a[17];
a[17]=a[38];
a[38]=temp1;
a[5]=a[50];
a[50]=a[14];
a[14]=a[41];
a[41]=temp2;
a[8]=a[47];
a[47]=a[11];
a[11]=a[44];
a[44]=temp3;
a[27]=a[33];
a[33]=a[35];
a[35]=a[29];
a[29]=temp4;
a[28]=a[30];
a[30]=a[34];
a[34]=a[32];
a[32]=temp5;
}
void F(int *a)
{
int temp1,temp2,temp3,temp4,temp5;
temp1=a[42];
temp2=a[43];
temp3=a[44];
temp4=a[0];
temp5=a[1];
a[42]=a[26];
a[26]=a[53];
a[53]=a[27];
a[27]=temp1;
a[43]=a[23];
a[23]=a[52];
a[52]=a[30];
a[30]=temp2;
a[44]=a[20];
a[20]=a[51];
a[51]=a[33];
a[33]=temp3;
a[0]=a[6];
a[6]=a[8];
a[8]=a[2];
a[2]=temp4;
a[1]=a[3];
a[3]=a[7];
a[7]=a[5];
a[5]=temp5;
}
void D(int *a)
{
int temp1,temp2,temp3,temp4,temp5;
temp1=a[6];
temp2=a[7];
temp3=a[8];
temp4=a[51];
temp5=a[52];
a[6]=a[24];
a[24]=a[17];
a[17]=a[33];
a[33]=temp1;
a[7]=a[25];
a[25]=a[16];
a[16]=a[34];
a[34]=temp2;
a[8]=a[26];
a[26]=a[15];
a[15]=a[35];
a[35]=temp3;
a[51]=a[45];
a[45]=a[47];
a[47]=a[53];
a[53]=temp4;
a[52]=a[48];
a[48]=a[46];
a[46]=a[50];
a[50]=temp5;
}
void L(int *a)
{
int temp1,temp2,temp3,temp4,temp5;
temp1=a[0];
temp2=a[3];
temp3=a[6];
temp4=a[20];
temp5=a[23];
a[0]=a[36];
a[36]=a[15];
a[15]=a[51];
a[51]=temp1;
a[3]=a[39];
a[39]=a[12];
a[12]=a[48];
a[48]=temp2;
a[6]=a[42];
a[42]=a[9];
a[9]=a[45];
a[45]=temp3;
a[20]=a[18];
a[18]=a[24];
a[24]=a[26];
a[26]=temp4;
a[23]=a[19];
a[19]=a[21];
a[21]=a[25];
a[25]=temp5;
}
void B(int *a)
{
int temp1,temp2,temp3,temp4,temp5;
temp1=a[36];
temp2=a[37];
temp3=a[38];
temp4=a[9];
temp5=a[10];
a[36]=a[29];
a[29]=a[47];
a[47]=a[24];
a[24]=temp1;
a[37]=a[32];
a[32]=a[46];
a[46]=a[21];
a[21]=temp2;
a[38]=a[35];
a[35]=a[45];
a[45]=a[18];
a[18]=temp3;
a[9]=a[11];
a[11]=a[17];
a[17]=a[15];
a[15]=temp4;
a[10]=a[14];
a[14]=a[16];
a[16]=a[12];
a[12]=temp5;
}
void X(int *a)
{
int temp1,temp2,temp3;
temp1=a[3];
temp2=a[4];
temp3=a[5];
a[3]=a[30];
a[30]=a[14];
a[14]=a[21];
a[21]=temp1;
a[4]=a[31];
a[31]=a[13];
a[13]=a[22];
a[22]=temp2;
a[5]=a[32];
a[32]=a[12];
a[12]=a[23];
a[23]=temp3;
}
void Y(int *a)
{
int temp1,temp2,temp3;
temp1=a[1];
temp2=a[4];
temp3=a[7];
a[1]=a[52];
a[52]=a[16];
a[16]=a[37];
a[37]=temp1;
a[4]=a[49];
a[49]=a[13];
a[13]=a[40];
a[40]=temp2;
a[7]=a[46];
a[46]=a[10];
a[10]=a[43];
a[43]=temp3;
}
void Z(int *a)
{
int temp1,temp2,temp3;
temp1=a[39];
temp2=a[40];
temp3=a[41];
a[39]=a[25];
a[25]=a[50];
a[50]=a[28];
a[28]=temp1;
a[40]=a[22];
a[22]=a[49];
a[49]=a[31];
a[31]=temp2;
a[41]=a[19];
a[19]=a[48];
a[48]=a[34];
a[34]=temp3;
}
int main()
{
char s[202];
int a[55];
int i,j,length,flag=0;
scanf("%s",s);
length=strlen(s);
for(i=0;i<54;i++)
{
a[i]=i;
}
for(j=0;j<length;j++)
{
if(s[j]=='U')
{
U(a);
}
else if(s[j]=='u')
{
U(a);
U(a);
U(a);
}
else if(s[j]=='F')
{
F(a);
}
else if(s[j]=='f')
{
F(a);
F(a);
F(a);
}
else if(s[j]=='L')
{
L(a);
}
else if(s[j]=='l')
{
L(a);
L(a);
L(a);
}
else if(s[j]=='R')
{
R(a);
}
else if(s[j]=='r')
{
R(a);
R(a);
R(a);
}
else if(s[j]=='D')
{
D(a);
}
else if(s[j]=='d')
{
D(a);
D(a);
D(a);
}
else if(s[j]=='B')
{
B(a);
}
else if(s[j]=='b')
{
B(a);
B(a);
B(a);
}
else if(s[j]=='X')
{
X(a);
}
else if(s[j]=='x')
{
X(a);
X(a);
X(a);
}
else if(s[j]=='Y')
{
Y(a);
}
else if(s[j]=='y')
{
Y(a);
Y(a);
Y(a);
}
else if(s[j]=='Z')
{
Z(a);
}
else if(s[j]=='z')
{
Z(a);
Z(a);
Z(a);
}
}
for(i=0;i<54;i++)
{
if(a[i]!=i)
{
flag=1;
break;
}
else
;
}
if(flag==0)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}</span>