魔方

问题描述


      魔方是一种常见的玩具。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秒 64M 0
题解思路

整体思路:

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

具体实现:

      根据个人的喜好,可以设置一个一维或是二维的数组来记录开始时候每个魔方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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值