问题描述:魔方是一种常见的玩具。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,表示逆时针旋转。
测试用例输出:Yes
现在我们给出一个操作序列,问在这么旋转之后,魔方是否和原来的时候完全一样。比如UXd被认为是不一样。输入为一个长度不超过200的字符串,仅包含之上定义的18个字母。如果能复原,输出Yes,否则输出No。
测试用例输出:Yes
#include<stdio.h>
char Cube[6][9];
void Init ( void );
void Front ( void );
void Back ( void );
void Up ( void );
void Down ( void );
void Left ( void );
void Right ( void );
void X ( void );
void Y ( void );
void Z ( void );
int main( )
{
int i , j ;
char ch;
Init( );
while( (ch=getchar())!='\n' )
{
if( ch=='F' )
Front( );
else if( ch=='B' )
Back( );
else if( ch=='U' )
Up( );
else if( ch=='D' )
Down( );
else if( ch=='L' )
Left( );
else if( ch=='R' )
Right( );
else if( ch=='X' )
X( );
else if( ch=='Y' )
Y( );
else if( ch=='Z' )
Z( );
else if( ch=='f' )
{
for( i=1 ; i<=3 ; i++ )
Front( );
}
else if( ch=='b' )
{
for( i=1 ; i<=3 ; i++ )
Back( );
}
else if( ch=='u' )
{
for( i=1 ; i<=3 ; i++ )
Up( );
}
else if( ch=='d' )
{
for( i=1 ; i<=3 ; i++ )
Down( );
}
else if( ch=='l' )
{
for( i=1 ; i<=3 ; i++ )
Left( );
}
else if( ch=='r' )
{
for( i=1 ; i<=3 ; i++ )
Right( );
}
else if( ch=='x' )
{
for( i=1 ; i<=3 ; i++ )
X( );
}
else if( ch=='y' )
{
for( i=1 ; i<=3 ; i++ )
Y( );
}
else if( ch=='z' )
{
for( i=1 ; i<=3 ; i++ )
Z( );
}
}
for( i=0 ; i<6 ; i++ )
{
for( j=0 ; j<9 ; j++ )
if( Cube[i][j] != Cube[i][0] )
{
printf("No\n");
return 0;
}
}
printf("Yes\n");
return 0;
}
void Init( void )
{
int i , j , k=1;
for( i=0 , k=1 ; i<6 ; i++ , k++ )
{
for( j=0 ; j<9 ; j++ )
Cube[i][j] = k;
}
}
void Front( void )
{
int k , j , Color[12];
for( k=0 ; k<9 ; k++ )
Color[k] = Cube[0][k];
Cube[0][0] = Color[6];
Cube[0][1] = Color[3];
Cube[0][2] = Color[0];
Cube[0][3] = Color[7];
Cube[0][4] = Color[4];
Cube[0][5] = Color[1];
Cube[0][6] = Color[8];
Cube[0][7] = Color[5];
Cube[0][8] = Color[2];
k=0;
for( j=6 ; j<9 ; j++ )
Color[k++] = Cube[4][j];
for( j=0 ; j<9 ; j+=3 )
Color[k++] = Cube[3][j];
for( j=8 ; j>0 ; j-=3 )
Color[k++] = Cube[5][j];
for( j=8 ; j>0 ; j-=3 )
Color[k++] = Cube[2][j];
k=0;
Cube[3][0] = Color[k++];
Cube[3][3] = Color[k++];
Cube[3][6] = Color[k++];
Cube[5][8] = Color[k++];
Cube[5][5] = Color[k++];
Cube[5][2] = Color[k++];
Cube[2][8] = Color[k++];
Cube[2][5] = Color[k++];
Cube[2][2] = Color[k++];
Cube[4][6] = Color[k++];
Cube[4][7] = Color[k++];
Cube[4][8] = Color[k++];
}
void Back( void )
{
int k , j , Color[12];
for( k=0 ; k<9 ; k++ )
Color[k] = Cube[1][k];
Cube[1][0] = Color[6];
Cube[1][1] = Color[3];
Cube[1][2] = Color[0];
Cube[1][3] = Color[7];
Cube[1][4] = Color[4];
Cube[1][5] = Color[1];
Cube[1][6] = Color[8];
Cube[1][7] = Color[5];
Cube[1][8] = Color[2];
k=0;
for( j=2 ; j>=0 ; j-- )
Color[k++] = Cube[4][j];
for( j=0 ; j<9 ; j+=3 )
Color[k++] = Cube[2][j];
for( j=0 ; j<9 ; j+=3 )
Color[k++] = Cube[5][j];
for( j=8 ; j>0 ; j-=3 )
Color[k++] = Cube[3][j];
k=0;
Cube[2][0] = Color[k++];
Cube[2][3] = Color[k++];
Cube[2][6] = Color[k++];
Cube[5][0] = Color[k++];
Cube[5][3] = Color[k++];
Cube[5][6] = Color[k++];
Cube[3][8] = Color[k++];
Cube[3][5] = Color[k++];
Cube[3][2] = Color[k++];
Cube[4][2] = Color[k++];
Cube[4][1] = Color[k++];
Cube[4][0] = Color[k++];
}
void Up( void )
{
int k , j , Color[12];
for( k=0 ; k<9 ; k++ )
Color[k] = Cube[4][k];
Cube[4][0] = Color[6];
Cube[4][1] = Color[3];
Cube[4][2] = Color[0];
Cube[4][3] = Color[7];
Cube[4][4] = Color[4];
Cube[4][5] = Color[1];
Cube[4][6] = Color[8];
Cube[4][7] = Color[5];
Cube[4][8] = Color[2];
k=0;
for( j=2 ; j>=0 ; j-- )
Color[k++] = Cube[0][j];
for( j=2 ; j>=0 ; j-- )
Color[k++] = Cube[2][j];
for( j=2 ; j>=0 ; j-- )
Color[k++] = Cube[1][j];
for( j=2 ; j>=0 ; j-- )
Color[k++] = Cube[3][j];
k=0;
Cube[2][2] = Color[k++];
Cube[2][1] = Color[k++];
Cube[2][0] = Color[k++];
Cube[1][2] = Color[k++];
Cube[1][1] = Color[k++];
Cube[1][0] = Color[k++];
Cube[3][2] = Color[k++];
Cube[3][1] = Color[k++];
Cube[3][0] = Color[k++];
Cube[0][2] = Color[k++];
Cube[0][1] = Color[k++];
Cube[0][0] = Color[k++];
}
void Down( void )
{
int k , j , Color[12];
for( k=0 ; k<9 ; k++ )
Color[k] = Cube[5][k];
Cube[5][0] = Color[6];
Cube[5][1] = Color[3];
Cube[5][2] = Color[0];
Cube[5][3] = Color[7];
Cube[5][4] = Color[4];
Cube[5][5] = Color[1];
Cube[5][6] = Color[8];
Cube[5][7] = Color[5];
Cube[5][8] = Color[2];
k=0;
for( j=6 ; j<=8 ; j++ )
Color[k++] = Cube[0][j];
for( j=6 ; j<=8 ; j++ )
Color[k++] = Cube[3][j];
for( j=6 ; j<=8 ; j++ )
Color[k++] = Cube[1][j];
for( j=6 ; j<=8 ; j++ )
Color[k++] = Cube[2][j];
k=0;
Cube[3][6] = Color[k++];
Cube[3][7] = Color[k++];
Cube[3][8] = Color[k++];
Cube[1][6] = Color[k++];
Cube[1][7] = Color[k++];
Cube[1][8] = Color[k++];
Cube[2][6] = Color[k++];
Cube[2][7] = Color[k++];
Cube[2][8] = Color[k++];
Cube[0][6] = Color[k++];
Cube[0][7] = Color[k++];
Cube[0][8] = Color[k++];
}
void Left( void )
{
int k , j , Color[12];
for( k=0 ; k<9 ; k++ )
Color[k] = Cube[2][k];
Cube[2][0] = Color[6];
Cube[2][1] = Color[3];
Cube[2][2] = Color[0];
Cube[2][3] = Color[7];
Cube[2][4] = Color[4];
Cube[2][5] = Color[1];
Cube[2][6] = Color[8];
Cube[2][7] = Color[5];
Cube[2][8] = Color[2];
k=0;
for( j=0 ; j<9 ; j+=3 )
Color[k++] = Cube[4][j];
for( j=0 ; j<9 ; j+=3 )
Color[k++] = Cube[0][j];
for( j=2 ; j>=0 ; j-- )
Color[k++] = Cube[5][j];
for( j=8 ; j>=0 ; j-=3 )
Color[k++] = Cube[1][j];
k=0;
Cube[0][0] = Color[k++];
Cube[0][3] = Color[k++];
Cube[0][6] = Color[k++];
Cube[5][2] = Color[k++];
Cube[5][1] = Color[k++];
Cube[5][0] = Color[k++];
Cube[1][8] = Color[k++];
Cube[1][5] = Color[k++];
Cube[1][2] = Color[k++];
Cube[4][0] = Color[k++];
Cube[4][3] = Color[k++];
Cube[4][6] = Color[k++];
}
void Right( void )
{
int k , j , Color[12];
for( k=0 ; k<9 ; k++ )
Color[k] = Cube[3][k];
Cube[3][0] = Color[6];
Cube[3][1] = Color[3];
Cube[3][2] = Color[0];
Cube[3][3] = Color[7];
Cube[3][4] = Color[4];
Cube[3][5] = Color[1];
Cube[3][6] = Color[8];
Cube[3][7] = Color[5];
Cube[3][8] = Color[2];
k=0;
for( j=8 ; j>=0 ; j-=3 )
Color[k++] = Cube[4][j];
for( j=0 ; j<9 ; j+=3 )
Color[k++] = Cube[1][j];
for( j=6 ; j<9 ; j++ )
Color[k++] = Cube[5][j];
for( j=8 ; j>=0 ; j-=3 )
Color[k++] = Cube[0][j];
k=0;
Cube[1][0] = Color[k++];
Cube[1][3] = Color[k++];
Cube[1][6] = Color[k++];
Cube[5][6] = Color[k++];
Cube[5][7] = Color[k++];
Cube[5][8] = Color[k++];
Cube[0][8] = Color[k++];
Cube[0][5] = Color[k++];
Cube[0][2] = Color[k++];
Cube[4][8] = Color[k++];
Cube[4][5] = Color[k++];
Cube[4][2] = Color[k++];
}
void X( void )
{
int k , j , Color[12];
k=0;
for( j=5 ; j>=3 ; j-- )
Color[k++] = Cube[0][j];
for( j=5 ; j>=3 ; j-- )
Color[k++] = Cube[2][j];
for( j=5 ; j>=3 ; j-- )
Color[k++] = Cube[1][j];
for( j=5 ; j>=3 ; j-- )
Color[k++] = Cube[3][j];
k=0;
Cube[2][5] = Color[k++];
Cube[2][4] = Color[k++];
Cube[2][3] = Color[k++];
Cube[1][5] = Color[k++];
Cube[1][4] = Color[k++];
Cube[1][3] = Color[k++];
Cube[3][5] = Color[k++];
Cube[3][4] = Color[k++];
Cube[3][3] = Color[k++];
Cube[0][5] = Color[k++];
Cube[0][4] = Color[k++];
Cube[0][3] = Color[k++];
}
void Y( void )
{
int k , j , Color[12];
k=0;
for( j=7 ; j>=0 ; j-=3 )
Color[k++] = Cube[4][j];
for( j=1 ; j<9 ; j+=3 )
Color[k++] = Cube[1][j];
for( j=3 ; j<=5 ; j++ )
Color[k++] = Cube[5][j];
for( j=7 ; j>=0 ; j-=3 )
Color[k++] = Cube[0][j];
k=0;
Cube[1][1] = Color[k++];
Cube[1][4] = Color[k++];
Cube[1][7] = Color[k++];
Cube[5][3] = Color[k++];
Cube[5][4] = Color[k++];
Cube[5][5] = Color[k++];
Cube[0][7] = Color[k++];
Cube[0][4] = Color[k++];
Cube[0][1] = Color[k++];
Cube[4][7] = Color[k++];
Cube[4][4] = Color[k++];
Cube[4][1] = Color[k++];
}
void Z( void )
{
int k , j , Color[12];
k=0;
for( j=3 ; j<=5 ; j++ )
Color[k++] = Cube[4][j];
for( j=1 ; j<9 ; j+=3 )
Color[k++] = Cube[3][j];
for( j=7 ; j>=0 ; j-=3 )
Color[k++] = Cube[5][j];
for( j=7 ; j>=0 ; j-=3 )
Color[k++] = Cube[2][j];
k=0;
Cube[3][1] = Color[k++];
Cube[3][4] = Color[k++];
Cube[3][7] = Color[k++];
Cube[5][7] = Color[k++];
Cube[5][4] = Color[k++];
Cube[5][1] = Color[k++];
Cube[2][7] = Color[k++];
Cube[2][4] = Color[k++];
Cube[2][1] = Color[k++];
Cube[4][3] = Color[k++];
Cube[4][4] = Color[k++];
Cube[4][5] = Color[k++];
}
代码分析:采用了模拟法的算法,代码结构流程非常清晰,思路简单,就是根据题目所示的意思来模拟要解决问题的步骤,一个简单的方法就是拿一个真正的魔方或者纸质的方体,并标上数字,这样比起纯空间想象要容易得多,错误率得以降低,不过代码的18的函数定义非常相似,可想方法来给予优化。请问大家这里有什么更好的算法或者可以优化这18个函数尽量简洁一点的方法么?