【问题标题】:Generate admissible permutations生成可接受的排列
【发布时间】:2015-03-15 19:23:52
【问题描述】:

我想生成一个集合列表的所有可能排列,但排列并不都符合条件。排列是集合列表的子集排列的组合。

例如,我们有以下由两个子集组成的列表:List = {(1,2), (3,4)}; 允许的排列是:1234/1243/2134/2143/3412/4312/3421/4321 不允许以下排列:1423/3142/1324/1342/2431/2341 / ....

我已经生成了所有可能的排列,但不是那些可接受的排列。

static void permute(ArrayList<Integer> arr, int k){
  for(int i = k; i < arr.size(); i++){
      java.util.Collections.swap(arr, i, k);
      permute(arr, k+1);
      java.util.Collections.swap(arr, k, i);
  }
  if (k == arr.size() -1){
      System.out.println(java.util.Arrays.toString(arr.toArray()));
  }

}

我真的需要这段代码来计算欧文的价值(博弈论)。提前谢谢你

【问题讨论】:

    标签: java algorithm arraylist


    【解决方案1】:

    这里的问题是你得到了第一个数组的可能排列,然后是第二个数组并将它们连接起来,你需要做的就是做你在代码中做的同样的事情,然后创建一个新的 2darray第一个数组的第一个值,第二个数组的第一个值,然后是第二个数组的第二个值,然后是第一个数组的第二个值。因此,您可以使用当前技术找到 {(1,2), (3,4)} 可能的排列,然后您可以找到 {(1,3), (2,4)} 和 {(1, 4), (2,4)} 等等。

    如果您有超过 2 个列表,那么有用的来源是 http://www.programcreek.com/2013/02/leetcode-permutations-java/ 它解释了这个过程,并有代码说明。

    【讨论】:

    • 您好,我无法解决问题。我有两个以上的数组,所以我不能写一个通用的解决方案。请帮助我,我真的需要解决方案。提前谢谢你。
    • 我完善了答案。看看吧。
    【解决方案2】:

    看起来您有 8 个允许排列,即具有 4 个叶子的完全二叉树的对称群的元素,S2 wreath S2。如果这是您通常想要的,您可以通过循环遍历第一级的排列来生成所有这些,然后对于其中的每一个,循环遍历第二级排列的所有选择,固定排列第一层。

    如果 n 非常小,则可以生成所有排列,然后拒绝那些不产生第一级一致排列的排列。

    【讨论】:

      猜你喜欢
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      相关资源
      最近更新 更多