说我的清单是
{1,2,3,4}
我的标题可能不够描述,但这是我想做的事情.. 我希望我的代码生成以下
{ (1,2) , (3,4) }
{ (1,3) , (2,4) }
{ (1,4) , (2,3) }
{ (2,1) , (4,3) }
{ (3,1) , (4,2) }
{ (4,1) , (3,2) }
,即我想要该套装的所有4C2组合。
注意:这里最初的四个元素只是一个说明性的数字..数字可能会变化,直到8或10。
现在,我如何为它编写代码(在C或php中)。
基本上,我想知道算法。不是全部。甚至一个开端就足够了.. 我只是想不出任何事情。 请帮助。 感谢。
我想我没解释清楚;实际上我自己没有得到问题。 我想要的是,比方说我有4支球队,而且我希望每支球队都能对抗另一支球队,那么我如何生成所有的比赛。 在我上面的例子中;考虑1,2,3,4为4支球队。和 {(1,2),(3,4)}作为一组固定装置等。 我该怎么做呢。 因此我需要的是生成所有NC2 /(N / 2)组的灯具。 (在这种情况下N = 4)
答案 0 :(得分:2)
基本上,我想知道算法。不是全部,甚至是 headstart会很好......我只是想不出什么可以开始 从
如果你想要一个headstart,Python文档会显示用于实现组合函数的算法。使用普通的for循环替换range(),使用 printf 替换 yield ,并且应该很容易转换为C或PHP:http://docs.python.org/library/itertools.html#itertools.combinations
请注意,一次两个采取的四件事的组合产生:(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)
。您的示例输出还包括每个的补码(即(1, 2)
附带(3, 4)
)。
答案 1 :(得分:1)
我做了这个(PHP)。我添加了第三个参数,可用于让函数返回每个可能的组合,无论元素的顺序是否重要。初始选项集和返回组合将是数组
function every_combinations($set, $n, $order_matters = false) {
$combinations = [];
foreach($set AS $k => $e) {
$subset = $set;
unset($subset[$k]);
if($n == 1) $combinations[] = [$e];
else {
$subcomb = every_combinations($subset, $n - 1, $order_matters);
foreach($subcomb AS $s) {
$comb = array_merge([$e], $s);
if($order_matters) $combinations[] = $comb;
else {
$needle = $comb;
sort($needle);
if(!in_array($needle, $combinations)) $combinations[] = $comb;
}
}
}
}
return $combinations;
}