魔方可以對它的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左右,在下學識尚淺,有不足的地方望大家批評指正