每周一道算法题006:抽签组合
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每周一道算法题006:抽签组合相关的知识,希望对你有一定的参考价值。
问题:有如下3支队伍,每个队伍都有2名队员。
team1:A,B;
team2:C,D;
team3:E,F;
现在每个队出1个人,组成一个队去探险,请列出所有的组队方式。
思路:
这就是一个组合的问题,每个队里挑一人,那么总共应该有222=8种组合方式。
如果暴力求解,那就是三层循环嵌套。但如果问题扩展一下,变成10个队,每个队10人,就无法暴力求解了,至少代码是没有扩展性的。
有如下一种思路:
循环所有的队伍
第一次取出A,B两名队员,存起来;
第二次取出C,D两名队员,与前一轮存下的队员进行交叉组合,得到AC,AD,BC,BD4种组合,再存起来;
第三次取出E,F两名队员,再与前一轮存下的结果进行交叉组合,得到ACE,ACF,ADE,ADF,BCE,BCF,BDE,BDF。
以此类推。
每一次循环都将前本轮的队员与前一轮的队员进行组合,直到将所有的组合遍历完毕。
解答:
<?php
function getCombinations($arrays)
$result = array(array());
foreach ($arrays as $property => $property_values)
$tmp = array();
foreach ($result as $result_item)
foreach ($property_values as $property_value)
$tmp[] = array_merge($result_item, array($property => $property_value));
$result = $tmp;
return $result;
$combinations = getCombinations(
array(
‘item1‘ => array(‘A‘, ‘B‘),
‘item2‘ => array(‘C‘, ‘D‘),
‘item3‘ => array(‘E‘, ‘F‘),
)
);
$rs = $combinations;
print_r($rs);
输出:
Array
(
[0] => Array
(
[item1] => A
[item2] => C
[item3] => E
)
[1] => Array
(
[item1] => A
[item2] => C
[item3] => F
)
[2] => Array
(
[item1] => A
[item2] => D
[item3] => E
)
[3] => Array
(
[item1] => A
[item2] => D
[item3] => F
)
[4] => Array
(
[item1] => B
[item2] => C
[item3] => E
)
[5] => Array
(
[item1] => B
[item2] => C
[item3] => F
)
[6] => Array
(
[item1] => B
[item2] => D
[item3] => E
)
[7] => Array
(
[item1] => B
[item2] => D
[item3] => F
)
)
golang:
package main
import "fmt"
func main()
// 三组数据,每组选一个进行组合,总数应是2*2*2
d := make(map[string][]string)
d["item1"] = []string"A", "B"
d["item2"] = []string"C", "D"
d["item3"] = []string"E", "F"
rs := getCombinations(d)
fmt.Println(rs)
// 取得组合列表
func getCombinations(data map[string][]string) [][]map[string]string
result := make([][]map[string]string, 1)
for property, propertyValues := range data
tmp := make([][]map[string]string, 0)
for _, resultItem := range result
for _, propertyValue := range propertyValues
tmp = append(tmp, append(resultItem, map[string]stringproperty: propertyValue))
result = tmp
return result
输出:(格式略作调整)
[[map[item1:A] map[item2:C] map[item3:E]]
[map[item1:A] map[item2:C] map[item3:F]]
[map[item1:A] map[item2:D] map[item3:E]]
[map[item1:A] map[item2:D] map[item3:F]]
[map[item1:B] map[item2:C] map[item3:E]]
[map[item1:B] map[item2:C] map[item3:F]]
[map[item1:B] map[item2:D] map[item3:E]]
[map[item1:B] map[item2:D] map[item3:F]]]
以上是关于每周一道算法题006:抽签组合的主要内容,如果未能解决你的问题,请参考以下文章