劍指Offer28:排列組合問題升級版

正方體頂點排列問題

問題描述

輸入一個含有8個數字的數組,判斷有沒有可能把這8個數字分別放到正方體的8個頂點上,使得正方體上三組相對的面上的4個頂點的和相等。

問題分析:

 *  * 這就相當於先得到a1,a2,a3,a4,a5,a6,a7,a8這8個數字的所有排列,然後判斷有沒有一個的排列符合題目給定的條件,即a1+a2+a3+a4=a5+a6+a7+a8,
 *  * a1+a3+a5+a7=a2+a4+a6+a8,並且a1+a2+a5+a6=a3+a4+a7+a8.
public class Code028_02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] data = new int[8];
        for (int i = 0; i < 8; i++) {
            data[i] = sc.nextInt();
        }
//        permutation(data, 0);
//        System.out.println(count);
        boolean result=cubeVertex(data);
        System.out.println(result);
    }

    static int count = 0;

    private static void permutation(int[] data, int index) {
        if (index == data.length - 1) {
            if (data[0] + data[1] + data[2] + data[3] == data[4] + data[5] + data[6] + data[7] &&
                    data[0] + data[2] + data[4] + data[6] == data[1] + data[3] + data[5] + data[7] &&
                    data[0] + data[1] + data[4] + data[5] == data[2] + data[3] + data[6] + data[7]) {
                for (int i = 0; i < data.length; i++) {
                    System.out.print("" + data[i] + " ,");
                }
                count += 1;
                System.out.println();
            }
        }
        for (int i = index; i < data.length; i++) {
            swap(data, index, i);
            permutation(data, index + 1);
            swap(data, index, i);
        }
    }

    private static void swap(int[] data, int index, int i) {
        int temp = data[index];
        data[index] = data[i];
        data[i] = temp;
    }

    //方式二:
    private static boolean cubeVertex(int[] data) {
        if (data.length != 8) {
            return false;
        }
        return cubeCore(data, 0);
    }

    private static boolean cubeCore(int[] data, int start) {
        if (data.length != 8 || start < 0) {
            return false;
        }
        boolean result = false;
        if (start == data.length - 1) {
            if (Sum(data, 0, 1, 2, 3) == Sum(data, 4, 5, 6, 7) && Sum(data, 0, 2, 4, 6) == Sum(data, 1, 3, 5, 7) &&
                    Sum(data, 0, 1, 4, 5) == Sum(data, 2, 3, 6, 7)) {
                result = true;
            }
        } else {
            for (int i = start; i < data.length; i++) {
                if (i != start && data[i] == data[start]) {
                    continue;
                }
                swap(data, i, start);
                result = cubeCore(data, start + 1);
                if (result) {
                    break;
                }
                swap(data, i, start);
            }
        }
        return result;
    }

    private static int Sum(int[] data, int i, int i1, int i2, int i3) {
        return data[i] + data[i1] + data[i2] + data[i3];
    }
    //字符全排列測試函數
    @Test
    public  void test(){
        String yy ="ABCD";
        char data[] = yy.toCharArray();
        sq(data, 0);
    }
    public static void sq(char data[], int k) {
        if (k == data.length) {
            for (int i = 0; i < data.length; i++) {
                System.out.print(data[i] + " ");
            }
            System.out.println();
        }
        for (int i = k; i < data.length; i++) {
            {
                char temp = data[k];
                data[k] = data[i];
                data[i] = temp;
            }
            sq(data, k + 1);
            {
                char temp = data[k];
                data[k] = data[i];
                data[i] = temp;
            }
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章