【题目取自CSDN-671coder】
第四题:二阶魔方
题目描述:
魔方可以对它的6个面自由旋转。
我们来操作一个2阶魔方(如图1所示)
为了描述方便,我们为它建立了坐标系。
各个面的初始状态如下:
x轴正向:绿
x轴反向:蓝
y轴正向:红
y轴反向:橙
z轴正向:白
z轴反向:黄
假设我们规定,只能对该魔方进行3种操作。分别标记为:
x 表示在x轴正向做顺时针旋转
y 表示在y轴正向做顺时针旋转
z 表示在z轴正向做顺时针旋转
基本旋转后的效果如图2,3,4所示。
xyz 则表示顺序执行x,y,z 3个操作
题目的要求是:
从标准输入获得一个串,表示操作序列。
程序输出:距离我们最近的那个小方块的3个面的颜色。
顺序是:x面,y面,z面。
例如:在初始状态,应该输出:
绿红白
初始状态下,如果用户输入:
x
则应该输出:
绿白橙
初始状态下,如果用户输入:
zyx
则应该输出:
红白绿
样例输入:
xy
xxyyy
xyzzzzyyyxxx
xyyzzz
xyxyzzxyxyzz
样例输出:
红白绿
白红蓝
绿红白
黄绿橙
白绿红
解答
分析,设置方块类(取名叫Main而已)
对应正面的四个方块为
front[0] front[1]
front[2] front[3]
和正面方块相邻的反面方块的下标相同(即front[0]后面是back[0],1后面是back[1])
其他只要注意转动时的变化就行
[java] view
plaincopyprint?
- import java.util.Scanner;
- public class Main {
- char front;
- char back;
- char left;
- char right;
- char up;
- char down;
- public Main() {
- super();
- front = ‘G‘;// 绿色
- back = ‘B‘;// 蓝色
- left = ‘O‘;// 橙色
- right = ‘R‘;// 红色
- up = ‘W‘;// 白色
- down = ‘Y‘;// 黄色
- }
- public void x() {
- char tmp = up;
- up = left;
- left = down;
- down = right;
- right = tmp;
- }
- public void y() {
- char tmp = up;
- up = front;
- front = down;
- down = back;
- back = tmp;
- }
- public void z() {
- char tmp = front;
- front = right;
- right = back;
- back = left;
- left = tmp;
- }
- public void print() {
- System.out.println(print(front) + print(right) + print(up));
- }
- public static String print(char c) {
- String color = null;
- switch (c) {
- case ‘G‘:
- color = "绿";
- break;
- case ‘B‘:
- color = "蓝";
- break;
- case ‘O‘:
- color = "橙";
- break;
- case ‘R‘:
- color = "红";
- break;
- case ‘W‘:
- color = "白";
- break;
- case ‘Y‘:
- color = "黄";
- break;
- default:
- break;
- }
- return color;
- }
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- while (sc.hasNext()) {
- String op = sc.next();
- Main front[] = new Main[4];// 正面4个方块
- Main back[] = new Main[4];// 背面对应正面位置的4个方块
- for (int i = 0; i < 4; i++) {
- front[i] = new Main();
- back[i] = new Main();
- }
- for (int i = 0; i < op.length(); i++) {
- switch (op.charAt(i)) {
- case ‘x‘:
- for (int j = 0; j < 4; j++) {// 正面4个方块转动
- front[j].x();
- }
- Main tmp = front[0];
- front[0] = front[2];
- front[2] = front[3];
- front[3] = front[1];
- front[1] = tmp;
- break;
- case ‘y‘:
- for (int j = 1; j <= 3; j += 2) {// 右侧转动
- front[j].y();
- back[j].y();
- }
- Main tmp2 = front[1];
- front[1] = front[3];
- front[3] = back[3];
- back[3] = back[1];
- back[1] = tmp2;
- break;
- case ‘z‘:
- for (int j = 0; j <= 1; j++) {
- front[j].z();
- back[j].z();
- }
- Main tmp3 = back[0];
- back[0] = front[0];
- front[0] = front[1];
- front[1] = back[1];
- back[1] = tmp3;
- default:
- break;
- }
- }
- front[1].print();
- }
- }
- }
时间: 2025-01-01 07:42:46