二阶魔方旋转


魔方可以对它的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
则应该输出:
红白绿




请编程实现所述功能。


//初始化状态  
int shang[4]={0,0,0,0};   //白色
int xia[4]={1,1,1,1}; //黄色
int zhuo[4]={2,2,2,2}; //橙色
int you[4]={3,3,3,3}; //红色
int qian[4]={4,4,4,4}; //绿色
int hou[4]={5,5,5,5};       //蓝色


void  x()
{
int t;
t=qian[0];
qian[0]=qian[1];
qian[1]=qian[3];
qian[3]=qian[2];
qian[2]=t;


int temp[2];


temp[0] =shang[0];
temp[1] = shang[1];


shang[0]=zhuo[1];
shang[1]=zhuo[0];


zhuo[0] = xia[0];
zhuo[1] = xia[1];


xia[0] = you[1];
xia[1] = you[0];


you[0] = temp[0];
you[1] = temp[1];
}


void y()
{
int t;
t= you[0];
you[0]=you[1];
you[1]=you[3];
you[3]=you[2];
you[2]=t;


int temp[2];
temp[0] = shang[1];
temp[1] = shang[3];


shang[3] = qian[2];
shang[1] = qian[3];


qian[2] = xia[1];
qian[3] = xia[3];


xia[1] = hou[3];
xia[3] = hou[2];


hou[3] = temp[1];
hou[2] = temp[0];
}


void z()
{
int t;
t= shang[0];
shang[0]=shang[1];
shang[1]=shang[3];
shang[3]=shang[2];
shang[2]=t;




int temp[2];
temp[0] = qian[0];
temp[1] = qian[2];


qian[0] = you[0];
qian[2] = you[2];


you[0] = hou[2];
you[2] = hou[0];


hou[2]=zhuo[2];
hou[0] = zhuo[0];


zhuo[2] = temp[0];
zhuo[0] = temp[1];
}


void panduan(int n)
{
if(n==0)
printf("白");
else if(n==1)
printf("黄");
else if(n==2)
printf("橙");
else if(n==3)
printf("红");
else if(n==4)
printf("绿");
else
printf("蓝");
}
int main()
{
char s[100];
scanf("%s",s);
for(int i=0;s[i]!='\0';i++)
{
if(s[i] =='x')
x();
else if(s[i] == 'y')
y();
else if(s[i]=='z')
z();
}


panduan(qian[2]);
panduan(you[0]);
panduan(shang[1]);
printf("\n");
}



你可能感兴趣的:(acm算法)