蓝桥杯-魔方旋转问题

魔方可以对它的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左右,在下学识尚浅,有不足的地方望大家批评指正

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值