天天看點

藍橋杯-魔方旋轉問題

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