全排列

作者: JaJIng | 来源:发表于2019-04-03 16:07 被阅读0次
/**
 * 通用的根据数组输入得到全排列的程序
 */
public class PermutationExt {
    /**
     * 应用排列解决问题1:输入一个含有8个数字的数组,
     * 判断有没有可能吧这8个数字分别放到正方体的8个顶点,使得正方体三对相对的面上的4个顶点的和相等
     */
    public List<int[]> possibilitiesOfCube(int[] array) {
        List<int[]> list = new ArrayList<>();
        if (array == null || array.length == 0) {
            return list;
        }

        // 得到全排列集合
        List<int[]> all = permutation(array);
        // 筛选:满足三个对立面的值相等才会被加入最终结果集中
        for (int[] arr : all) {
            if (checkSum(arr)) list.add(arr);
        }
        return list;
    }

    public List<int[]> permutation(int[] array) {
        List<int[]> list = new ArrayList<>();
        collect(array, 0, list);
        return list;
    }

    private void collect(int[] array, int begin, List<int[]> list) {
        if (begin == array.length - 1) {
            // list中没有同样的序列
            if (!has(list, array)) {
                // 必须使用副本,不能直接传入引用,否则list所有的int[]对象最后都一样
                list.add(Arrays.copyOf(array, array.length));
                return;
            }
        }

        for (int i = begin; i < array.length; i++) {
            swap(array, i, begin);
            collect(array, begin + 1, list);
            swap(array, i, begin);
        }
    }

    private boolean checkSum(int[] array) {
        if ((array[0] + array[2] + array[4] + array[6] == array[1] + array[3] + array[5] + array[7]) &&
                (array[0] + array[1] + array[2] + array[3] == array[4] + array[5] + array[6] + array[7]) &&
                (array[2] + array[3] + array[6] + array[7] == array[0] + array[1] + array[4] + array[5])) {
            return true;
        }
        return false;
    }

    private boolean has(List<int[]> list, int[] a) {
        for (int[] arr : list) {
            if (equal(arr, a)) return true;
        }

        return false;
    }

    private boolean equal(int[] a, int[] b) {
        for (int i = 0; i < a.length; i++) {
            if (a[i] != b[i]) return false;
        }
        return true;
    }

    private void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    public static void main(String[] args) {
        PermutationExt p = new PermutationExt();
        int[] a = {8, 3, 5, 4, 1, 2, 5, 6};
        List<int[]> list = p.possibilitiesOfCube(a);
        System.out.println("有" + list.size() + "种可能");
        for (int[] arr : list) {
            System.out.println(Arrays.toString(arr));
        }
    }
}

相关文章

  • 全排列与字典序

    全排列 递归实现全排列; 首先来说递归算法实现全排列: 例如,对于{1,2,3,4}的例子进行全排列,其可以分解...

  • 全排列

    求全排列最简单的就是递归了123 的全排列共有 6 个, 123 的全排列等于以 1 开头 23 的全排列, 加上...

  • 全排列

    题目 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排...

  • 全排列

    递归的版本image.png

  • 全排列

  • 全排列

  • 全排列

    给出一个列表[1,2,3],其全排列为: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,...

  • 全排列

    给定一个数字列表,返回其所有可能的排列。

  • 全排列

    给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出:[[1,2,3],[1,...

  • 全排列

    两种方法:第一种方法:递归: 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递...

网友评论

      本文标题:全排列

      本文链接:https://www.haomeiwen.com/subject/ugyzbqtx.html