魔方可以对它的6个面自由旋转。
我们来操作一个2阶魔方(如下
所示):
为了描述方便,我们为它建立了坐标系。
各个面的初始状态如下:
x轴正向:绿
x轴反向:蓝
y轴正向:红
y轴反向:橙
z轴正向:白
z轴反向:黄
假设我们规定,只能对该魔方进行3种操作。分别标记为:
x 表示在x轴正向做顺时针旋转
y 表示在y轴正向做顺时针旋转
z 表示在z轴正向做顺时针旋转
xyz 则表示顺序执行x,y,z 3个操作。
输入描述:
输入一个串,表示操作序列。
例如:
样例输入:
x
输出描述:
输出距离我们最近的那个小方块的3个面的颜色。
顺序是:x面,y面,z面。
例如:
对应输出:
绿白橙
运行限制
最大运行时间:1s
最大运行内存: 256M
注:
魔方通过旋转每一个面的颜色就会改变,所以先定义一个魔方的初始状态(题中各个面颜色分别相同)用数组较为简单,用不同数字代表魔方的不同颜色。每经过一次转动,用数字代表颜色的各个数组就发生变化`
代码里面的view数组是旋转时存放颜色的过渡数组,任意一个面旋转,正对魔方旋转面的四周颜色(八个面)会改变如下图(进行X操作)
进行view的临时存储后,再进行魔方本身的颜色改变
还有一点,在你进行旋转后,魔方的每一个面的序号就不能动了,如图
进行下一次操作时也是按照原来拟定好的序号
import java.util.*;
public class Main {
//定义各边颜色
public int front[] = {1, 1, 1, 1};
public int back[] = {2, 2, 2, 2};
public int left[] = {3, 3, 3, 3};
public int right[] = {4, 4, 4, 4};
public int up[] = {5, 5, 5, 5};
public int down[] = {6, 6, 6, 6};
//进行旋转操作
public void reX() {
//旋转后颜色变化的方块存入view
int[] view = new int[8];
view[0] = down[3];
view[1] = down[2];
view[2] = right[2];
view[3] = right[0];
view[4] = up[3];
view[5] = up[2];
view[6] = left[1];
view[7] = left[3];
//记录旋转后各个面的颜色
up[2] = view[7];
up[3] = view[6];
right[0] = view[5];
right[3] = view[4];
down[2] = view[3];
down[3] = view[2];
left[1] = view[0];
left[3] = view[1];
//当前面(x四个面)颜色交换
view[0] = front[0];
view[1] = front[1];
view[2] = front[2];
view[3] = front[3];
front[0] = view[2];
front[1] = view[0];
front[2] = view[3];
front[3] = view[1];
}
public void reY() {
int[] view = new int[8];
//旋转后颜色变化的方块存入view
view[0] = down[2];
view[1] = down[0];
view[2] = back[2];
view[3] = back[0];
view[4] = up[1];
view[5] = up[3];
view[6] = front[1];
view[7] = front[3];
//记录旋转后各个面的颜色
up[1] = view[6];
up[3] = view[7];
back[0] = view[5];
back[2] = view[4];
down[2] = view[2];
down[0] = view[3];
front[1] = view[0];
front[3] = view[1];
//当前面(y四个面)颜色交换
view[0] = right[0];
view[1] = right[1];
view[2] = right[2];
view[3] = right[3];
right[0] = view[2];
right[1] = view[0];
right[2] = view[3];
right[3] = view[1];
}
public void reZ() {
int[] view = new int[8];
//旋转后颜色变化的方块存入view
view[0] = front[0];
view[1] = front[1];
view[2] = right[0];
view[3] = right[1];
view[4] = back[0];
view[5] = back[1];
view[6] = left[0];
view[7] = left[1];
//记录旋转后各个面的颜色
left[1] = view[0];
left[0] = view[1];
back[0] = view[6];
back[1] = view[7];
right[1] = view[5];
right[0] = view[4];
front[0] = view[2];
front[1] = view[3];
//当前面(z四个面)颜色交换
view[0] = up[0];
view[1] = up[1];
view[2] = up[2];
view[3] = up[3];
up[0] = view[2];
up[1] = view[0];
up[2] = view[3];
up[3] = view[1];
}
public void run(String s){
String[] d = s.split("");
for (int i = 0; i < d.length; i++) {
if (d[i].equals("x")) {
reX();
} else if (d[i].equals("y") ) {
reY();
} else if(d[i].equals("z"))
reZ();
}
//完成一系列的旋转操作后输出魔方最近面的颜色
//开始咱们定义的各个面颜色按前后左右上下分别为1,2,3,4,5,6
//所以颜色组别里base【0】为空
String base[]={"","绿","蓝","橙","红","白","黄"};
int color[]=new int[3];
color[0]=front[1];//x
color[1]=right[0];//y
color[2]=up[3];//z
for(int i=0;i<color.length;i++){
System.out.print(base[color[i]]);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
Main l=new Main();
l.run(str);
}
}
本题在蓝桥杯上运行超时,时间要求在1S,运行时为1.5S左右,在下学识尚浅,有不足的地方望大家批评指正