加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

每周一道算法题006:抽签组合

发布时间:2020-12-13 22:17:03 所属栏目:PHP教程 来源:网络整理
导读:问题: 有如下3支队伍,每个队伍都有2名队员。 team1:A,B; team2:C,D; team3:E,F; 现在每个队出1个人,组成一个队去探险,请列出所有的组队方式。 思路: 这就是一个组合的问题,每个队里挑一人,那么总共应该有2 2 2=8种组合方式。 如果暴力求解,那就是三
问题:

有如下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

<?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]string{property: 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]]]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读