二阶魔方
魔方可以对它的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
则应该输出:
红白绿
请编程实现所述功能。
这个是蓝桥杯某年的决赛题目,我上网找了答案,可是答案看了很久看不懂,求各位帮忙注释一下每行代码的功能可以么?
#include <iostream>
#include <string>
using namespace std;
static int A[4];
static int B[4];
static int C[4];
static int D[4];
static int E[4];
static int F[4];
#define GREEN 1
#define WHITE 2
#define ORANGE 3
#define RED 4
#define YELLOW 5
#define BLUE 6
string get_color(int id)
{
switch (id)
{
case GREEN:
return "绿";
case WHITE:
return "白";
case ORANGE:
return "橙";
case RED:
return "红";
case YELLOW:
return "黄";
case BLUE:
return "蓝";
}
}
void init()
{
for (int i = 0;i < 4;i++)
{
A[i] = GREEN;
B[i] = WHITE;
C[i] = ORANGE;
D[i] = RED;
E[i] = YELLOW;
F[i] = BLUE;
}
}
void x_rotate()
{
int t1 = A[0];
int t2 = 0;
A[0] = A[2];
A[2] = A[3];
A[3] = A[1];
A[1] = t1;
t1 = E[0];
t2 = E[1];
E[0] = D[3];
E[1] = D[2];
D[2] = B[2];
D[3] = B[3];
B[2] = C[2];
B[3] = C[3];
C[2] = t2;
C[3] = t1;
return;
}
void y_rotate()
{
int t1 = D[0];
int t2 = 0;
D[0] = D[2];
D[2] = D[3];
D[3] = D[1];
D[1] = t1;
t1 = F[1];
t2 = F[3];
F[1] = B[1];
F[3] = B[3];
B[1] = A[1];
B[3] = A[3];
A[1] = E[1];
A[3] = E[3];
E[1] = t1;
E[3] = t2;
return;
}
void z_rotate()
{
int t1 = B[0];
int t2 = 0;
B[0] = B[2];
B[2] = B[3];
B[3] = B[1];
B[1] = t1;
t1 = F[2];
t2 = F[3];
F[2] = C[3];
F[3] = C[1];
C[1] = A[0];
C[3] = A[1];
A[0] = D[2];
A[1] = D[0];
D[2] = t2;
D[0] = t1;
return;
}
int main()
{
string str;
while (cin >> str)
{
init();
for (int i = 0;i < str.size();i++)
{
switch (str[i])
{
case 'x':
x_rotate();
break;
case 'y':
y_rotate();
break;
case 'z':
z_rotate();
break;
}
}
cout << get_color(A[1]) << get_color(D[2]) << get_color(B[3]) << endl;
}
return 0;
}