二阶魔方旋转
时间: 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反
*/
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。