魔方旋转

题目描述:枚举训练

魔方可以对它的6个面自由旋转。


我们来操作一个2阶魔方(如图1所示):
为了描述方便,我们为它建立了坐标系。

各个面的初始状态如下:
x轴正向:绿
x轴反向:蓝
y轴正向:红
y轴反向:橙
z轴正向:白
z轴反向:黄

假设我们规定,只能对该魔方进行3种操作。分别标记为:
x 表示在x轴正向做顺时针旋转
y 表示在y轴正向做顺时针旋转
z 表示在z轴正向做顺时针旋转

xyz 则表示顺序执行x,y,z 3个操作
魔方旋转_第1张图片

魔方旋转_第2张图片

魔方旋转_第3张图片

魔方旋转_第4张图片
题目的要求是:
从标准输入获得一个串,表示操作序列。
程序输出:距离我们最近的那个小方块的3个面的颜色。
顺序是:x面,y面,z面。

例如:在初始状态,应该输出:
绿红白

初始状态下,如果用户输入:
x
则应该输出:
绿白橙

初始状态下,如果用户输入:
zyx
则应该输出:
红白绿

请编程实现所述功能。

解题思路:

对题目给定的各个面标上序号,如图所示:

魔方旋转_第5张图片魔方旋转_第6张图片

注意问题:

旋转时 与轴垂直的那个面也要旋转,比如转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;
	}
}



你可能感兴趣的:(算法)