魔方旋转 实用性原则

老师说,在企业开发中,一般遵循一下三个实用性原则,来达到快速结题、稳定、高效运行。

1,能枚举的尽量枚举。

        在规律特别繁琐复杂,而且特殊情况完全可以枚举完全的时候,完全没必要用一堆if来进行规律的表达。

        此时枚举反而使程序更加易读。方便后期的维护升级。

2,逆算尝试。

3,先试探。


例题:魔方可以对它的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
则应该输出:

红白绿


package KeCheng1;

public class T1XinYongKa {
	
	//操作位置
		static int[][] transx={{0,1,2,3},{4,21,14,19},{7,20,13,18}};
		static int[][] transy={{4,5,6,7},{1,17,11,21},{2,18,8,22}};
		static int[][] transz={{16,17,18,19},{0,12,8,4},{1,13,9,5}};
	
	static char[] f(char[] a,int[][] trans){
		
		char[] b=java.util.Arrays.copyOf(a, a.length);
		
		for(int i=0;i<trans.length;i++){
			b[trans[i][1]] = a[trans[i][0]];
			b[trans[i][2]] = a[trans[i][1]];
			b[trans[i][3]] = a[trans[i][2]];
			b[trans[i][0]] = a[trans[i][3]];
		}
		
		return b;
	}
	
	static char[] g(char[] a,String s){
		char[] b=java.util.Arrays.copyOf(a, a.length);
		for(int i=0;i<s.length();i++){
			if(s.charAt(i)=='x') b=f(b,transx);
			if(s.charAt(i)=='y') b=f(b,transy);
			if(s.charAt(i)=='z') b = f(b, transz);
		}
		return b;
	}
	

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		char[] init =  {'绿','绿','绿','绿',
				'红','红','红','红',
				'蓝','蓝','蓝','蓝',
				'橙','橙','橙','橙',
				'白','白','白','白',
				'黄','黄','黄','黄',};
		
		char[] b = g(init, "x");
		System.out.println(""+b[1]+b[4]+b[18]);

	}

}




猜你喜欢

转载自blog.csdn.net/xiaohaigary/article/details/79529895