自学内容网 自学内容网

华为OD机试 - 转骰子(Java 2024 E卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

假设有一个立方体,每个面有一个数字,初始为:前1,右2,前3(观察者方向),后4,上5,下6,用123456表示这个状态,放置在平面上。

  • 可以向左翻转(用L表示向左翻转1次);
  • 可以向右翻转(用R表示向右翻转1次);
  • 可以向前翻转(用F表示向前翻转1次);
  • 可以向后翻转(用B表示向后翻转1次);
  • 可以以逆时针旋转(用A表示逆时针旋转90度);
  • 可以以顺时针旋转(用C表示顺时针旋转90度)。

现在从123456这个初始状态开始,根据输入的动作/指令,计算得出最终的状态。

在这里插入图片描述

二、输入描述

输入一行,为只包含LRFBAC的字母序列,最大长度为50,字母可重复。

三、输出描述

输出最终状态。

四、测试用例

测试用例1:

1、输入

LR

2、输出

123456

3、说明

立方体先向左翻转,再向右翻转回去,最终还是恢复到初始状态123456。

测试用例2:

1、输入

FCR

2、输出

342156

3、说明

立方体先向前翻转,状态变为125643,然后顺时针旋转,状态变为651243,最后向右翻转,状态变为342156。

五、解题思路

模拟一个立方体在平面上的翻转和旋转操作。立方体有六个面,分别标记为左(Left)、右(Right)、前(Front)、后(Back)、上(Up)、下(Down),每个面上有一个数字。初始状态为123456,表示左1、右2、前3、后4、上5、下6。

每个操作(L、R、F、B、A、C)会改变立方体各面的数字位置。为了实现这一点,我们可以使用一个长度为6的数组state来表示立方体的六个面,索引分别对应左、右、前、后、上、下。每个操作对应一个特定的数组置换,通过预定义的旋转方法rotate来实现。

  1. 定义立方体状态:使用一个长度为6的数组state来表示立方体的六个面,索引分别对应左、右、前、后、上、下。
  2. 实现旋转方法:定义一个通用的旋转方法rotate,用于交换立方体上四个面的值。每个具体的操作(L、R、F、B、A、C)将调用rotate方法,传入相应的面索引。
  3. 读取输入并执行操作:使用Scanner读取输入的操作序列,逐个执行对应的操作方法。
  4. 输出最终状态:按照左、右、前、后、上、下的顺序输出state数组中的数字。

六、Java算法源码

public class OdTest01 {
    public static void rotate(int[] state, int a, int b, int c, int d) {
        int temp = state[a];  // 临时保存第一个面的值
        state[a] = state[b];  // 第二个面的值赋给第一个面
        state[b] = state[c];  // 第三个面的值赋给第二个面
        state[c] = state[d];  // 第四个面的值赋给第三个面
        state[d] = temp;      // 第一个面的值赋给第四个面
    }

    /**
     * 向左翻转 (L):
     * 将左 -> 上 -> 右 -> 下 -> 左
     */
    public static void turnL(int[] state) {
        rotate(state, 0, 4, 1, 5); // 左->上->右->下->左
    }

    /**
     * 向右翻转 (R):
     * 将左 -> 下 -> 右 -> 上 -> 左
     */
    public static void turnR(int[] state) {
        rotate(state, 0, 5, 1, 4); // 左->下->右->上->左
    }

    /**
     * 向前翻转 (F):
     * 将前 -> 上 -> 后 -> 下 -> 前
     */
    public static void turnF(int[] state) {
        rotate(state, 2, 4, 3, 5); // 前->上->后->下->前
    }

    /**
     * 向后翻转 (B):
     * 将前 -> 下 -> 后 -> 上 -> 前
     */
    public static void turnB(int[] state) {
        rotate(state, 2, 5, 3, 4); // 前->下->后->上->前
    }

    /**
     * 逆时针旋转 (A):
     * 将左 -> 后 -> 右 -> 前 -> 左
     */
    public static void turnA(int[] state) {
        rotate(state, 0, 3, 1, 2); // 左->后->右->前->左
    }

    /**
     * 顺时针旋转 (C):
     * 将左 -> 前 -> 右 -> 后 -> 左
     */
    public static void turnC(int[] state) {
        rotate(state, 0, 2, 1, 3); // 左->前->右->后->左
    }

    public static void main(String[] args) {
        // 创建一个扫描器对象,用于读取用户输入的指令序列
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();  // 从输入中读取一串动作指令

        // 初始状态:立方体各个面的编号,依次表示 左、右、前、后、上、下。
        int[] state = {1, 2, 3, 4, 5, 6};  // 初始状态: 左1,右2,前3,后4,上5,下6

        // 遍历输入的每一个字符,根据指令执行相应的操作
        for (char ch : s.toCharArray()) {
            switch (ch) {
                case 'L':
                    turnL(state); // 执行左翻转
                    break;
                case 'R':
                    turnR(state); // 执行右翻转
                    break;
                case 'F':
                    turnF(state); // 执行前翻转
                    break;
                case 'B':
                    turnB(state); // 执行后翻转
                    break;
                case 'A':
                    turnA(state); // 执行逆时针旋转
                    break;
                case 'C':
                    turnC(state); // 执行顺时针旋转
                    break;
                default:
                    // 忽略无效字符
                    break;
            }
        }

        // 输出最终立方体的六个面状态,按照左、右、前、后、上、下的顺序
        for (int num : state) {
            System.out.print(num);
        }
    }
}

七、效果展示

1、输入

A

2、输出

431256

3、说明

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述


原文地址:https://blog.csdn.net/guorui_java/article/details/142715652

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!