【问题标题】:array subset combinations in javascript for a card gamejavascript中用于纸牌游戏的数组子集组合
【发布时间】:2017-12-25 10:51:24
【问题描述】:

我在用 javascript 制作纸牌游戏时无法找到组合电子问题的解决方案。我想获得一个集合的所有组合,以便使用所有元素。

given: [1, 2, 3]
returns: [
    [[1], [2], [3]],
    [[1, 2], 3],
    [[1, 3], 2],
    [[2, 3], 1],
    [[1, 2, 3]]
]

游戏是Cassino

【问题讨论】:

标签: javascript math permutation partition


【解决方案1】:
 function permute(arr){
   const res = [];
   for(var map = 1; map < 2 ** arr.length; map++){
     const rest = [],
           subset = arr.filter((el, i) => (map & (1 << i)) || (rest.push(el), false));
     //console.log(subset, rest);
     res.push(...(rest.length ? permute(rest).map(arr => [subset,...arr]) : [[subset]]));
   }
   //console.log(res);
   return res;
 }

 console.log(permute([1,2,3]))

Try it!

【讨论】:

  • 这实际上更接近解决方案。它有多余的结果,因为对我来说顺序无关紧要,但它包括所有正确的子集组合。不过,也许我更容易过滤掉重复的内容,谢谢!
【解决方案2】:

这个问题可以用递归的方式解决。

首先我们需要声明两个数组,一个包含输入(给定数组),另一个包含结果(最初为空)

var givenArray = [1, 2, 3];
var resultArray = [];

现在让我们创建递归函数,它将一个子集数组推送到我们的结果数组:

function getSubArray(array, position) {
    if(position === givenArray.length) {
        resultArray.push(array);
        return;
    }
    getSubArray(array.concat(givenArray[position]), position+1);
    getSubArray(array, position+1);
}

现在开始将所有子集设置为resultArray,我们只需调用getSubArray 函数,并使用一个空数组和一个起始位置为0 作为参数

getSubArray([], 0);

之后,如果您想从结果中删除空集 ([]),只需删除 resultArray 的最后一个元素 resultArray.splice(-1,1);

您可以通过此链接在线测试算法:https://jsbin.com/xigipihebe/edit?js,console

【讨论】:

  • 这是一个很好的无序排列实现,但这不是我想要的。在我的场景中,我需要枚举这些排列并找到它们的所有可能组合,这些组合使用原始数组中的所有元素。你给定的数组var givenArray = [1, 2, 3]; 返回[[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3]]。我正在寻找类似[ [[1], [2], [3]], [[1, 2], 3], [[1, 3], 2], [[2, 3], 1], [[1, 2, 3]]] 的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 2012-02-29
  • 2021-03-05
  • 2018-01-17
  • 1970-01-01
相关资源
最近更新 更多