我了解如何通过手工解决问题,但我想创建一个 Javascript 程序来为 (c,r) 完成此操作,其中 c 是容器,r 是岩石。
设置
您有 4 block 相同类型的无法区分的岩石。您还有 10 个容器。每个容器可以容纳 0 block 石头或 1 block 石头。所有 4 block 石头都需要在每个排列中使用,在每个排列中留下 6 个 0。
我相信基于组合生成器应该有大约 210 种可能性(10!)/(4!*(10-4)!)。
例如,这些是可能性的例子:
1111000000
1110100000
1110001000
0000001111
0101010100
我正在寻找的是一个 javascript 函数,它将吐出 210 个数组,因此它是 [1,1,1,1,0,0,0,0,0,0]
输入一些岩石和容器。
最佳答案
我尝试了@JonTrent 的方法(从 0
到 2^c - 1
),这是一个非常聪明的方法:
function getCombinations(c, r) {
const max = Math.pow(2, c);
const res = [];
for (let i = 0; i < max; i++) {
const binary = i.toString(2);
if (binary.split("1").length - 1 === r) {
res.push(
binary.padStart(c, '0')
.split('')
.map(n => parseInt(n, 10))
);
}
}
return res;
}
const res = getCombinations(10, 4);
// [
// [0,0,0,0,0,0,1,1,1,1],
// [0,0,0,0,0,1,0,1,1,1],
// [0,0,0,0,0,1,1,0,1,1]
// ...
// ]
document.body.innerHTML = `<pre>${res.map(x => x.join('')).join('\n')}</pre>`;
console.log(`${res.length} combinations found!`);
关于javascript - 解决循环组合程序问题的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62624462/