4. 魔方旋转
【问题描述】
魔方可以对它的6个面自由旋转。
我们来操作一个2阶魔方(如图1所示):
为了描述方便,我们为它建立了坐标系。
各个面的初始状态如下:
x轴正向:绿
x轴反向:蓝
y轴正向:红
y轴反向:橙
z轴正向:白
z轴反向:黄
假设我们规定,只能对该魔方进行3种操作。分别标记为:
x 表示在x轴正向做顺时针旋转
y 表示在y轴正向做顺时针旋转
z 表示在z轴正向做顺时针旋转
xyz 则表示顺序执行x,y,z 3个操作
题目的要求是:
用户从键盘输入一个串,表示操作序列。
程序输出:距离我们最近的那个小方块的3个面的颜色。
顺序是:x面,y面,z面。
例如:在初始状态,应该输出:
绿红白
初始状态下,如果用户输入:
x
则应该输出:
绿白橙
初始状态下,如果用户输入:
zyx
则应该输出:
红白绿
面的标号
模仿旋转示意图
我的c++代码:
#include<iostream>
#include<string>
using namespace std;
string f[4]={"绿","绿","绿","绿"};
string l[4]={"橙","橙","橙","橙"};
string r[4]={"红","红","红","红"};
string d[4]={"黄","黄","黄","黄"};
string u[4]={"白","白","白","白"};
string b[4]={"蓝","蓝","蓝","蓝"};
//answer= f[1],r[0],u[2]
void x()
{
string temp1=l[1];
string temp2=l[2];
l[1] = d[0];
l[2] = d[1];
d[0] = r[3];
d[1] = r[0];
r[3] = u[2];
r[0] = u[3];
u[2] = temp1;
u[3] = temp2;
temp1 =f[0];
f[0] = f[3];
f[3] = f[2];
f[2] = f[1];
f[1] = temp1;
}
void y()
{
string temp1=f[1];
string temp2=f[2];
f[1] = d[1];
f[2] = d[2];
d[1] = b[3];
d[2] = b[0];
b[3] = u[1];
b[0] = u[2];
u[1] = temp1;
u[2] = temp2;
temp1 =r[0];
r[0] = r[3];
r[3] = r[2];
r[2] = r[1];
r[1] = temp1;
}
void z()
{
string temp0=l[0];
string temp1=l[1];
l[0] = f[0];
l[1] = f[1];
f[0] = r[0];
f[1] = r[0];
r[0] = b[0];
r[1] = b[1];
b[0] = temp0;
b[1] = temp1;
temp1 =u[0];
u[0] = u[3];
u[3] = u[2];
u[2] = u[1];
u[1] = temp1;
}
int main()
{
string str;
cin>>str;
for(int i=0 ; i<(int)str.length(); i++)
{
string temp = str.substr(i,1);
if(temp == "x")
x();
if(temp == "y")
y();
if(temp == "z")
z();
}
cout<<f[1]<<r[0]<<u[2];
return 0;
}