- 题目
一个三阶魔方由六个面组成,颜色分别是白色(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<iostream>
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<<center<<Elem1<<Elem2<<Elem3<<Elem4<<Elem5<<Elem6<<Elem7<<Elem8<<endl;
}
// MagicCube.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include"MagicCube.h"
#include<iostream>
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<<"您可以对魔方做如下操作:"<<endl;
cout<<"1)U:白色面顺时针旋转90度"<<endl;
cout<<"2)D:黄色面顺时针旋转90度"<<endl;
cout<<"3)F:红色面顺时针旋转90度"<<endl;
cout<<"4)B:橙色面顺时针旋转90度"<<endl;
cout<<"5)L:绿色面顺时针旋转90度"<<endl;
cout<<"6)R:蓝色面顺时针旋转90度"<<endl;
cin>>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=N3;
Cgreen.Elem2=N4;
Cgreen.Elem3=N5;
break;
case 'L':Cgreen.Curfaceturn();
N3=Cwhite.Elem3;
N2=Cwhite.Elem2;
N1=Cwhite.Elem1;
Cwhite.Elem3=Corenge.Elem3;
Cwhite.Elem2=Corenge.Elem3;
Cwhite.Elem1=Corenge.Elem1;
Corenge.Elem3=Cyellow.Elem3;
Corenge.Elem2=Cyellow.Elem2;
Corenge.Elem1=Cyellow.Elem1;
Cyellow.Elem3=Cred.Elem3;
Cyellow.Elem2=Cred.Elem2;
Cyellow.Elem1=Cred.Elem1;
Cred.Elem3=N3;
Cred.Elem2=N2;
Cred.Elem1=N1;
break;
case 'R':Cblue.Curfaceturn();
N5=Cwhite.Elem5;
N6=Cwhite.Elem6;
N7=Cwhite.Elem7;
Cwhite.Elem5=Cred.Elem5;
Cwhite.Elem6=Cred.Elem6;
Cwhite.Elem7=Cred.Elem7;
Cred.Elem5=Cyellow.Elem5;
Cred.Elem6=Cyellow.Elem6;
Cred.Elem7=Cyellow.Elem7;
Cyellow.Elem5=Corenge.Elem5;
Cyellow.Elem6=Corenge.Elem6;
Cyellow.Elem7=Corenge.Elem7;
Corenge.Elem5=N5;
Corenge.Elem6=N6;
Corenge.Elem7=N7;
break;
default:
break;
}
i++;
}
Cwhite.display();
Cyellow.display();
Cred.display();
Corenge.display();
Cgreen.display();
Cblue.display();
system("pause");
return 0;
}
编译环境VS2012,编译结果:
才疏学浅,敬请指针,谢谢!