题目描述:枚举训练
魔方可以对它的6个面自由旋转。
我们来操作一个2阶魔方(如图1所示):
为了描述方便,我们为它建立了坐标系。
各个面的初始状态如下:
x轴正向:绿
x轴反向:蓝
y轴正向:红
y轴反向:橙
z轴正向:白
z轴反向:黄
假设我们规定,只能对该魔方进行3种操作。分别标记为:
x 表示在x轴正向做顺时针旋转
y 表示在y轴正向做顺时针旋转
z 表示在z轴正向做顺时针旋转
xyz 则表示顺序执行x,y,z 3个操作
我们来操作一个2阶魔方(如图1所示):
为了描述方便,我们为它建立了坐标系。
各个面的初始状态如下:
x轴正向:绿
x轴反向:蓝
y轴正向:红
y轴反向:橙
z轴正向:白
z轴反向:黄
假设我们规定,只能对该魔方进行3种操作。分别标记为:
x 表示在x轴正向做顺时针旋转
y 表示在y轴正向做顺时针旋转
z 表示在z轴正向做顺时针旋转
xyz 则表示顺序执行x,y,z 3个操作
题目的要求是:
从标准输入获得一个串,表示操作序列。
程序输出:距离我们最近的那个小方块的3个面的颜色。
顺序是:x面,y面,z面。
例如:在初始状态,应该输出:
绿红白
初始状态下,如果用户输入:
x
则应该输出:
绿白橙
初始状态下,如果用户输入:
zyx
则应该输出:
红白绿
请编程实现所述功能。
解题思路:
对题目给定的各个面标上序号,如图所示:
注意问题:
旋转时 与轴垂直的那个面也要旋转,比如转X 则arr[0]的四个小面也要互换位置
package 暴力枚举;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 魔方旋转
{
/**
* 魔方可以对它的6个面自由旋转。
*
* 我们来操作一个2阶魔方(如图1所示): 为了描述方便,我们为它建立了坐标系。
*
* 各个面的初始状态如下: x轴正向:绿 x轴反向:蓝 y轴正向:红 y轴反向:橙 z轴正向:白 z轴反向:黄
*
* 假设我们规定,只能对该魔方进行3种操作。分别标记为: x 表示在x轴正向做顺时针旋转 y 表示在y轴正向做顺时针旋转 z
* 表示在z轴正向做顺时针旋转
*
* xyz 则表示顺序执行x,y,z 3个操作
*
* 题目的要求是: 用户从键盘输入一个串,表示操作序列。 程序输出:距离我们最近的那个小方块的3个面的颜色。 顺序是:x面,y面,z面。
*
* 例如:在初始状态,应该输出: 绿红白
*
* 初始状态下,如果用户输入: x 则应该输出: 绿白橙
*
* 初始状态下,如果用户输入: zyx 则应该输出: 红白绿
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
// 魔方4*6 24 个小面 旋转->位置的旋转
// 魔方进行 X Y Z 每一种旋转 结果都能列出来(枚举的出来)
// 六面 每面四个
int arr[][] = new int[6][4];
// 0绿色 1蓝色 2红色 3橙色 4白色 5黄色
String[] colors = { "绿", "蓝", "红", "橙", "白", "黄" };
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 4; j++)
{
arr[i][j] = i;// 给每面染上色
}
}
// 骚操作
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String operate = bufferedReader.readLine();
for (int i = 0; i < operate.length(); i++)
{
if (operate.charAt(i) == 'x')
{
operateX(arr);
} else if (operate.charAt(i) == 'y')
{
operateY(arr);
} else if (operate.charAt(i) == 'z')
{
operateZ(arr);
}
}
// System.out.println(Arrays.toString(arr[0]));
// System.out.println(Arrays.toString(arr[2]));
// System.out.println(Arrays.toString(arr[4]));
// 最近的那个小方块的颜色 wc?whatcolor?
int xx = arr[0][3];
int yy = arr[2][0];
int zz = arr[4][1];
System.out.println(colors[xx] + colors[yy] + colors[zz]);
}
public static void operateX(int arr[][])
{
int b[][] = copyArr(arr);
arr[3][1] = b[5][2];
arr[3][0] = b[5][3];
arr[4][0] = b[3][0];
arr[4][1] = b[3][1];
arr[2][0] = b[4][0];
arr[2][1] = b[4][1];
arr[5][2] = b[2][1];
arr[5][3] = b[2][0];
// 自身面翻转
arr[0][0] = b[0][1];
arr[0][1] = b[0][3];
arr[0][3] = b[0][2];
arr[0][2] = b[0][0];
}
public static void operateY(int arr[][])
{
int b[][] = copyArr(arr);
arr[4][1] = b[0][1];
arr[4][3] = b[0][3];
arr[1][3] = b[4][3];
arr[1][0] = b[4][1];
arr[5][1] = b[1][1];
arr[5][3] = b[1][3];
arr[0][1] = b[5][1];
arr[0][3] = b[5][3];
// 自身面翻转
arr[2][0] = b[2][1];
arr[2][1] = b[2][3];
arr[2][3] = b[2][2];
arr[2][2] = b[2][0];
}
public static void operateZ(int arr[][])
{
int b[][] = copyArr(arr);
arr[0][2] = b[2][0];
arr[0][3] = b[2][2];
arr[2][0] = b[1][1];
arr[2][2] = b[1][0];
arr[1][1] = b[3][3];
arr[1][0] = b[3][1];
arr[3][1] = b[0][3];
arr[3][3] = b[0][2];
// 自身面翻转
arr[4][0] = b[4][1];
arr[4][1] = b[4][3];
arr[4][3] = b[4][2];
arr[4][2] = b[4][0];
}
private static int[][] copyArr(int[][] arr)
{
// 六面 每面四个
int brr[][] = new int[6][4];
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 4; j++)
{
brr[i][j] = arr[i][j];// 给每面染上色
}
}
return brr;
}
}