BIT2014级软件学院程序设计-16 魔方

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值