题目
一个三阶魔方由六个面组成,颜色分别是白色(W)、对面为黄色(Y)、红色(R)、对面为橙色(O)、绿色(G)、对面为蓝色(B)。如果手持魔方,白色向上,红色朝向自己,则绿色在左手侧。
请写一个程序,对一个处于还原状态(各面各块同色)的魔方,进行操作,打印操作后的魔方状态。操作指令为单个操作指令组成的字符串。单个操作指令包括:
1)U:白色面顺时针旋转90度
2)D:黄色面顺时针旋转90度
3)F:红色面顺时针旋转90度
4)B:橙色面顺时针旋转90度
5)L:绿色面顺时针旋转90度
6)R:蓝色面顺时针旋转90度
其中顺时针旋转定义为将该面朝向自己时的顺时针方向。
按WYROGB的顺序输出经过操作后6个面的状态。每个面首先输出中心块颜色,然后从此面面向自己时的左下角块开始,顺时针顺出每块的颜色。输出一面后换行。
请设计一个数据结构表示魔方,并基于该数据结构完成功能。
请用C/C++,
Java或
Python语言实现。请注意尽量以可成功编译或可直接运行为标准来编写代码。
示例:
输入:
LR
输出:
WOOOWRRRW
YRRRYOOOY
RWWWRYYYR
OYYYOWWWO
GGGGGGGGG
BBBBBBBBB
2. 自己编写的程序
////////////////////////////
////MagicCube.h
#include "stdafx.h"
#include
using namespace std; //定义每个面作为一个类 class cover { public: cover(char cen); ~cover(); void Curfaceturn(); void display(); char Elem1,Elem2,Elem3,Elem4,Elem5,Elem6,Elem7,Elem8;//每个面的周边元素,从左下角开始为Elem1 private: char center; //每个面的中心点,每个面中心颜色是确定的,也是每个面之所以为这个面的决定性属性 //后续颜色将不再改变,所以是类的私有数据成员。 }; cover::cover(char cen) //面类的构造函数,在构造函数里对每个面的九个点进行颜色初始化 { center=cen; Elem1=Elem2=Elem3=Elem4=Elem5=Elem6=Elem7=Elem8=cen; } cover::~cover() { } void cover::Curfaceturn() //每个面顺时针旋转时,其元素替换规律是一样的,所以可以只用类的成员函数来描述 { char E1,E2,E3; E1=Elem1;E2=Elem2;E3=Elem3;//记住当前面的三个元素的值 Elem3=Elem1; Elem2=Elem8; Elem1=Elem7; Elem8=Elem6; Elem7=Elem5; Elem6=Elem4; Elem5=E3; Elem4=E2; } void cover::display()//输出每个面的不同点的颜色 { cout<
// MagicCube.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include"MagicCube.h"
#include
using namespace std; int _tmain(int argc, _TCHAR* argv[]) { cover Cred('R'),Corenge('O'),Cwhite('W'),Cyellow('Y'),Cgreen('G'),Cblue('B'); char choice; char N1,N2,N3,N4,N5,N6,N7,N8; char s[20]; cout<<"您可以对魔方做如下操作:"<
>s; int i=0; while (s[i]!='\0') { choice=s[i]; switch (choice) { case 'U':Cwhite.Curfaceturn();//面旋转,自身元素的更新 //接下来是不同面之间元素的更新 N3=Cred.Elem3; N4=Cred.Elem4; N5=Cred.Elem4; Cred.Elem3=Cblue.Elem3; Cred.Elem4=Cblue.Elem4; Cred.Elem5=Cblue.Elem5; Cblue.Elem3=Corenge.Elem7; Cblue.Elem4=Corenge.Elem8; Cblue.Elem5=Corenge.Elem1; Corenge.Elem7=Cgreen.Elem3; Corenge.Elem8=Cgreen.Elem4; Corenge.Elem1=Cgreen.Elem5; Cgreen.Elem3=N3; Cgreen.Elem4=N4; Cgreen.Elem5=N5; break; case 'D':Cyellow.Curfaceturn(); N1=Cred.Elem1; N8=Cred.Elem8; N7=Cred.Elem7; Cred.Elem1=Cgreen.Elem1; Cred.Elem8=Cgreen.Elem8; Cred.Elem7=Cgreen.Elem7; Cgreen.Elem1=Corenge.Elem5; Cgreen.Elem8=Corenge.Elem4; Cgreen.Elem7=Corenge.Elem3; Corenge.Elem5=Cblue.Elem1; Corenge.Elem4=Cblue.Elem8; Corenge.Elem3=Cblue.Elem7; Cblue.Elem1=N1; Cblue.Elem8=N8; Cblue.Elem7=N7; break; case 'F':Cred.Curfaceturn(); N1=Cwhite.Elem1; N8=Cwhite.Elem8; N7=Cwhite.Elem7; Cwhite.Elem1=Cgreen.Elem7; Cwhite.Elem8=Cgreen.Elem6; Cwhite.Elem7=Cgreen.Elem5; Cgreen.Elem7=Cyellow.Elem5; Cgreen.Elem6=Cyellow.Elem4; Cgreen.Elem5=Cyellow.Elem3; Cyellow.Elem5=Cblue.Elem3; Cyellow.Elem4=Cblue.Elem2; Cyellow.Elem3=Cblue.Elem1; Cblue.Elem3=N1; Cblue.Elem2=N8; Cblue.Elem1=N7; break; case 'B':Corenge.Curfaceturn(); N3=Cwhite.Elem3; N4=Cwhite.Elem4; N5=Cwhite.Elem5; Cwhite.Elem3=Cblue.Elem5; Cwhite.Elem4=Cblue.Elem6; Cwhite.Elem5=Cblue.Elem7; Cblue.Elem5=Cyellow.Elem7; Cblue.Elem6=Cyellow.Elem8; Cblue.Elem7=Cyellow.Elem1; Cyellow.Elem7=Cgreen.Elem1; Cyellow.Elem8=Cgreen.Elem2; Cyellow.Elem1=Cgreen.Elem3; Cgreen.Elem1=N