二阶魔方旋转

二阶魔方旋转

时间: 1ms        内存:128M

描述:

魔方可以对它的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面。

示例输入:

xy

示例输出:

红白绿

提示:

参考答案(内存最优[1092]):

#include<stdio.h>
int a[30]={0,1,1,1,1,2,2,2,2,4,4,4,4,3,3,3,3,5,5,5,5,6,6,6,6};
  char s[299];
char b[7][10]={" ","绿","蓝","红","橙","白","黄"};
int main(){
   // freopen("f.txt","r",stdin);

  gets(s);
  int i;
  for(i=0;s[i]!='\0';i++){
    if(s[i]=='x'){
        int m=a[19],n=a[20];
        a[20]=a[10];
        a[19]=a[12];
        a[10]=a[23];
        a[12]=a[24];
        a[23]=a[15];
        a[24]=a[13];
        a[15]=n;
        a[13]=m;
        m=a[1];
        a[1]=a[3];
        a[3]=a[4];
        a[4]=a[2];
        a[2]=m;
    }
    if(s[i]=='y'){
        int m=a[20],n=a[18];
        a[20]=a[4];
        a[18]=a[2];
        a[4]=a[22];
        a[2]=a[24];
        a[22]=a[6];
        a[24]=a[8];
        a[6]=m;
        a[8]=n;
        m=a[13];
        a[13]=a[15];
        a[15]=a[16];
        a[16]=a[14];
        a[14]=m;
    }
    if(s[i]=='z'){
        int m=a[5],n=a[6];
        a[5]=a[10];
        a[6]=a[9];
        a[10]=a[2];
        a[9]=a[1];
        a[2]=a[14];
        a[1]=a[13];
        a[14]=m;
        a[13]=n;
        m=a[17];
        a[17]=a[19];
        a[19]=a[20];
        a[20]=a[18];
        a[18]=m;
    }
  }
  printf("%s%s%s",b[a[2]],b[a[13]],b[a[20]]);

}

参考答案(时间最优[0]):

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
	int x[2]={1,2};
	int y[2]={3,4};
	int z[2]={5,6};
	void changex(int [],int [],int []);
	void changey(int [],int [],int []);
	void changez(int [],int [],int []);
	char a[100];
	cin>>a;
	int i;
	for(i=0;i<strlen(a);i++)
	{
		if(a[i]=='x')changex(x,y,z);
		if(a[i]=='y')changey(x,y,z);
		if(a[i]=='z')changez(x,y,z);
	}
	switch(x[0])
	{
	case 1:cout<<"绿";break;
	case 2:cout<<"蓝";break;
	case 3:cout<<"红";break;
	case 4:cout<<"橙";break;
	case 5:cout<<"白";break;
	case 6:cout<<"黄";break;
	}
	switch(y[0])
	{
	case 1:cout<<"绿";break;
	case 2:cout<<"蓝";break;
	case 3:cout<<"红";break;
	case 4:cout<<"橙";break;
	case 5:cout<<"白";break;
	case 6:cout<<"黄";break;
	}
	switch(z[0])
	{
	case 1:cout<<"绿";break;
	case 2:cout<<"蓝";break;
	case 3:cout<<"红";break;
	case 4:cout<<"橙";break;
	case 5:cout<<"白";break;
	case 6:cout<<"黄";break;
	}
	cout<<endl;
	return 0;
}
void changex(int x[],int y[],int z[])
{
	int temp;
	temp=y[0];
	y[0]=z[0];
	z[0]=y[1];
	y[1]=z[1];
	z[1]=temp;
}
void changey(int x[],int y[],int z[])
{
	int temp;
	temp=z[0];
	z[0]=x[0];
	x[0]=z[1];
	z[1]=x[1];
	x[1]=temp;
}
void changez(int x[],int y[],int z[])
{
	int temp;
	temp=x[0];
	x[0]=y[0];
	y[0]=x[1];
	x[1]=y[1];
	y[1]=temp;
}
/*
绿 1
蓝 2
红 3
橙 4
白 5
黄 6
0正
1反
*/

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注