蓝桥杯 二阶魔方旋转 模拟



魔方可以对它的6个面自由旋转。


我们来操作一个2阶魔方(如图1所示):
为了描述方便,我们为它建立了坐标系。


各个面的初始状态如下:
x轴正向:绿
x轴反向:蓝
y轴正向:红
y轴反向:橙
z轴正向:白
z轴反向:黄


假设我们规定,只能对该魔方进行3种操作。分别标记为:
x 表示在x轴正向做顺时针旋转
y 表示在y轴正向做顺时针旋转
z 表示在z轴正向做顺时针旋转


xyz 则表示顺序执行x,y,z 3个操作
蓝桥杯 二阶魔方旋转 模拟_第1张图片蓝桥杯 二阶魔方旋转 模拟_第2张图片蓝桥杯 二阶魔方旋转 模拟_第3张图片蓝桥杯 二阶魔方旋转 模拟_第4张图片

题目的要求是:
从标准输入获得一个串,表示操作序列。
程序输出:距离我们最近的那个小方块的3个面的颜色。
顺序是:x面,y面,z面。


例如:在初始状态,应该输出:
绿红白


初始状态下,如果用户输入:
x
则应该输出:
绿白橙


初始状态下,如果用户输入:
zyx
则应该输出:
红白绿




请编程实现所述功能。


比较虐心的一道模拟题,主要是旋转的时候坐标点的替换,对于我这种右脑不发达的呆板来说,只能亲自做一个立方体,就像这样

蓝桥杯 二阶魔方旋转 模拟_第5张图片

将所有的坐标写在上面,然后再进行变换,其实坐标怎么规定都行,但是变换的时候会有不一样,只要确定好每种操作的坐标变换方式,就不会有太大的问题了,其实在做题之前,我还纠结了另外一个问题,就是选用什么数据结构来表示这个立方体,想来想去,其实立方体主要关心的就是面,而每个面恰好又有四个小面,这样,我们就可以用一个三维数组来表示同一个方向的两个面,比如在x轴上,正方向的面我们用x[0][x][y],反方向的面用x[1][x][y]来表示,然后我们把这些面封装在一个结构体中,再定义一个构造函数,来初始化成初始的颜色分布,主函数中只要进行各种操作就可以了


#include<iostream>
#include<string>
using namespace std;
int x[4]={0,1,1,0};
int y[4]={0,0,1,1};

struct Cube
{
	Cube()
	{
		for(int i=0;i<2;i++)
		{
			for(int j=0;j<2;j++)
			{
				for(int k=0;k<2;k++)
				{
					if(i==0)
					{
						x[i][j][k]="绿";
						y[i][j][k]="红";
						z[i][j][k]="白";
					}
					else if(i==1)
					{
						x[i][j][k]="蓝";
						y[i][j][k]="橙";
						z[i][j][k]="黄";
					}
				}
			}
		}
	}
	string x[2][2][2];
	string y[2][2][2];
	string z[2][2][2];
};

Cube cube;

void spinX()
{
	string temp[2];
	int i;
	temp[0]=cube.x[0][0][0];
	for(i=0;i<3;i++)
	cube.x[0][x[i]][y[i]]=cube.x[0][x[i+1]][y[i+1]];
	cube.x[0][0][1]=temp[0];
	
	temp[0]=cube.z[0][0][1];
	temp[1]=cube.z[0][0][0];
	
	cube.z[0][0][1]=cube.y[1][1][1];
	cube.z[0][0][0]=cube.y[1][0][1];
	cube.y[1][1][1]=cube.z[1][0][1];
	cube.y[1][0][1]=cube.z[1][0][0];
	cube.z[1][0][0]=cube.y[0][1][0]; 
	cube.z[1][0][1]=cube.y[0][0][0]; 
	cube.y[0][0][0]=temp[0];
	cube.y[0][1][0]=temp[1];
}

void spinY()
{
	string temp[2];
	int i;
	temp[0]=cube.y[0][0][0];
	for(i=0;i<3;i++)
	cube.y[0][x[i]][y[i]]=cube.y[0][x[i+1]][y[i+1]];
	cube.y[0][0][1]=temp[0];
	
	temp[0]=cube.z[0][0][0];
	temp[1]=cube.z[0][1][0];
	
	cube.z[0][0][0]=cube.x[0][1][1];
	cube.z[0][1][0]=cube.x[0][0][1];
	cube.x[0][1][1]=cube.z[1][1][1];
	cube.x[0][0][1]=cube.z[1][0][1];
	cube.z[1][1][1]=cube.x[1][0][0];
	cube.z[1][0][1]=cube.x[1][1][0];
	cube.x[1][0][0]=temp[0];
	cube.x[1][1][0]=temp[1];
}

void spinZ()
{
	string temp[2];
	int i;
	temp[0]=cube.z[0][0][0];
	for(i=0;i<3;i++)
	cube.z[0][x[i]][y[i]]=cube.z[0][x[i+1]][y[i+1]];
	cube.z[0][0][1]=temp[0];
	
	temp[0]=cube.x[0][0][0];
	temp[1]=cube.x[0][0][1];
	
	cube.x[0][0][0]=cube.y[0][0][0];
	cube.x[0][0][1]=cube.y[0][0][1];
	cube.y[0][0][0]=cube.x[1][0][0];
	cube.y[0][0][1]=cube.x[1][0][1];
	cube.x[1][0][0]=cube.y[1][0][0];
	cube.x[1][0][1]=cube.y[1][0][1];
	cube.y[1][0][0]=temp[0];
	cube.y[1][0][1]=temp[1];
}



int main()
{
	string op;
	int i;
	cin>>op;
	for(i=0;i<op.length();i++)
	{
		if(op[i]=='x')
		spinX();
		if(op[i]=='y')
		spinY();
		if(op[i]=='z')
		spinZ();
	}
	cout<<cube.x[0][0][1]<<cube.y[0][0][0]<<cube.z[0][0][0];
	return 0;
}





你可能感兴趣的:(模拟,ACM,蓝桥杯,二阶魔方旋转)