魔方

来源:互联网 发布:iaas paas saas阿里云 编辑:程序博客网 时间:2024/06/10 07:35

问题描述


      魔方是一种常见的玩具。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。


测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助测试用例 1以文本方式显示
  1. RUur↵
以文本方式显示
  1. Yes↵
1秒64M0
题解思路

整体思路:

      就是进行大型的模拟,利用子函数对魔方的各个小块进行操作,最后得到的魔方与刚开始的魔方对比,如果一模一样就说明可以实现复原,如果不是一模一样就说明不可以实现复原。

具体实现:

      根据个人的喜好,可以设置一个一维或是二维的数组来记录开始时候每个魔方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>


0 0