本文介绍如何通过编程模拟骰子在不同操作下的状态变化。给定初始状态和一系列操作指令,我们需要准确计算出最终的骰子各面数字排列。
题目描述
骰子是一个立方体,每个面一个数字,初始状态为:
- 左:1
- 右:2
- 前:3(观察者方向)
- 后:4
- 上:5
- 下:6
用 123456 表示这个状态。骰子可以执行以下操作:
- L:向左翻转1次
- R:向右翻转1次
- F:向前翻转1次
- B:向后翻转1次
- A:逆时针旋转90度(绕垂直轴)
- C:顺时针旋转90度(绕垂直轴)
从初始状态 123456 开始,根据输入的动作序列,计算最终状态。
输入输出要求
输入:一行只包含 LRFBAC 的字母序列,最大长度为50
输出:最终状态的六个数字,用空格分隔
示例
示例1
输入:LB
输出:5 6 1 2 3 4
说明:骰子先向左翻转,再向后翻转,得到状态 561234
示例2
输入:LR
输出:1 2 3 4 5 6
说明:骰子先向左翻转,再向右翻转回到原始状态
示例3
输入:FCR
输出:3 4 2 1 5 6
说明:
- 向前翻转:
123456→125643 - 顺时针旋转:
125643→562143 - 向右翻转:
562143→342156
变化规则参考
初始状态:{1,2,3,4,5,6}(索引0-5分别对应左、右、前、后、上、下)
| 操作 | 结果状态 | 索引映射关系 |
|---|---|---|
| L | {5,6,3,4,2,1} | [0]=[4];[1]=[5];[2]=[2];[3]=[3];[4]=[1];[5]=[0] |
| R | {6,5,3,4,1,2} | [0]=[5];[1]=[4];[2]=[2];[3]=[3];[4]=[0];[5]=[1] |
| F | {1,2,5,6,4,3} | [0]=[0];[1]=[1];[2]=[4];[3]=[5];[4]=[3];[5]=[2] |
| B | {1,2,6,5,3,4} | [0]=[0];[1]=[1];[2]=[5];[3]=[4];[4]=[2];[5]=[3] |
| A | {4,3,1,2,5,6} | [0]=[3];[1]=[2];[2]=[0];[3]=[1];[4]=[4];[5]=[5] |
| C | {3,4,2,1,5,6} | [0]=[2];[1]=[3];[2]=[1];[3]=[0];[4]=[4];[5]=[5] |
优化后的Java解法
import java.util.Scanner;
public class DiceSimulator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String operations = scanner.nextLine();
int[] dice = {1, 2, 3, 4, 5, 6}; // left, right, front, back, up, down
for (char op : operations.toCharArray()) {
int[] newState = new int[6];
switch (op) {
case 'L':
// 向左翻转:上→左,左→下,下→右,右→上
newState[0] = dice[4]; // left = up
newState[1] = dice[5]; // right = down
newState[2] = dice[2]; // front unchanged
newState[3] = dice[3]; // back unchanged
newState[4] = dice[1]; // up = right
newState[5] = dice[0]; // down = left
break;
case 'R':
// 向右翻转:上→右,右→下,下→左,左→上
newState[0] = dice[5]; // left = down
newState[1] = dice[4]; // right = up
newState[2] = dice[2]; // front unchanged
newState[3] = dice[3]; // back unchanged
newState[4] = dice[0]; // up = left
newState[5] = dice[1]; // down = right
break;
case 'F':
// 向前翻转:上→前,前→下,下→后,后→上
newState[0] = dice[0]; // left unchanged
newState[1] = dice[1]; // right unchanged
newState[2] = dice[4]; // front = up
newState[3] = dice[5]; // back = down
newState[4] = dice[3]; // up = back
newState[5] = dice[2]; // down = front
break;
case 'B':
// 向后翻转:上→后,后→下,下→前,前→上
newState[0] = dice[0]; // left unchanged
newState[1] = dice[1]; // right unchanged
newState[2] = dice[5]; // front = down
newState[3] = dice[4]; // back = up
newState[4] = dice[2]; // up = front
newState[5] = dice[3]; // down = back
break;
case 'A':
// 逆时针旋转(从上往下看):左→前,前→右,右→后,后→左
newState[0] = dice[3]; // left = back
newState[1] = dice[2]; // right = front
newState[2] = dice[0]; // front = left
newState[3] = dice[1]; // back = right
newState[4] = dice[4]; // up unchanged
newState[5] = dice[5]; // down unchanged
break;
case 'C':
// 顺时针旋转(从上往下看):左→后,后→右,右→前,前→左
newState[0] = dice[2]; // left = front
newState[1] = dice[3]; // right = back
newState[2] = dice[1]; // front = right
newState[3] = dice[0]; // back = left
newState[4] = dice[4]; // up unchanged
newState[5] = dice[5]; // down unchanged
break;
}
dice = newState;
}
// 输出结果
System.out.printf("%d %d %d %d %d %d%n",
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]);
}
}
代码优化亮点
- 可读性提升:使用
newState数组避免原地修改导致的逻辑混乱 - 注释清晰:每个操作都配有直观的物理意义说明
- 格式化输出:使用
printf替代字符串处理,更简洁高效 - 逻辑正确性:基于题目提供的映射关系实现,确保结果准确