Java-剑指offer-正方体的三面和相等

输入一个含有8个数字的数组,判断有没有可能把这8个数字分别放到正方体的8个顶点上,使得正方体上三组相对的面上的4个顶点的和都相等。

/** 
 * 题目描述:输入一个含有8个数字的数组,判断有没有可能把这8个数字分别放到正方体的8个顶点上,使得
 * 正方体上三组相对的面上的4个顶点的和都相等。
 * @author 崔洪振367
 * @version 创建时间:2017年8月27日 上午11:19:59 
 * 
 * 解题思路:先找出这个8个数字的全排列,然后验证每种全排列,是否满足三对面上的和相等。
 */
public class Q28_正方体的三面和相等 {

	public static void main(String[] args) {
		int[] array = {1,2,3,4,5,6,7,8};
		int[] array2 = {1,2,3,2,3,2,1,2};
		permutation(array2);
	}
	
	public static void permutation(int[] array){
		if(array == null || array.length == 0 || array.length>8){
			return ;
		}
		
		System.out.println(subPermutation(array, 0, array.length-1));
		//System.out.println(flag);
	}
	
	public static boolean subPermutation(int[] array, int start, int end){
		if(array == null || array.length<=0){
			return false;
		}
		if(start == end){
			return false;
		}
		if(isMatch(array)){
			//System.out.println(true);
			return true;
		}else{
			for(int p=start; p<=end; p++){
				swap(array, start, p);
				subPermutation(array, start+1, end);
				swap(array, start, p);
			}
		}
		return false;
	}

	private static void swap(int[] array, int start, int p) {
		int temp = array[start];
		array[start] = array[p];
		array[p] = temp;
	}

	private static boolean isMatch(int[] array) {
		if(array == null){
			return false;
		}
	    int r1 = array[0] + array[1] + array[2] + array[3];  
	    int r2 = array[4] + array[5] + array[6] + array[7];  
	    int r3 = array[0] + array[2] + array[4] + array[6];  
	    int r4 = array[1] + array[3] + array[5] + array[7];  
	    int r5 = array[0] + array[1] + array[4] + array[5];  
	    int r6 = array[2] + array[3] + array[6] + array[7]; 
		if(r1 == r2){
			if(r3 == r4){
				if(r5 == r6){
					return true;
				}
			}
		}
		return false;
	}

}

猜你喜欢

转载自blog.csdn.net/qq_30507287/article/details/77619453