如何从对象列表中获取n元素的不同TUPLES的所有组合?

时间:2018-02-22 22:04:31

标签: c# algorithm permutation

我有一个N个玩家的列表(比方说,14个玩家 - 示例中的1到14个数字)。

我想获得由X玩家制作的所有可能的Y队伍的集合。 当然可能会有玩家被遗弃

输入示例:N = 14名队员,Y = 3队,每队由X = 3名队员组成。 这意味着14名球员,分成3队3名球员。我想要所有的可能性。

1)[123],[456],[789] 10,11,12,13,14被遗漏。

2)[456],[789],[10,11,12] 1,2,3,13,14被排除在外。 3)....

我已经查看了这篇文章,这有助于我获得所有可能的X队员队伍,我认为这可以帮助我实现目标: What is the best way to find all combinations of items in an array? 既然我拥有所有可能的X球队,我需要更进一步。当我拥有所有可能的团队元组时,我将选择最适合我的需求的组合。你们能帮助我吗? C#代码会很棒,但即使是伪代码也可以提供帮助。

1 个答案:

答案 0 :(得分:1)

我认为你需要组合,而不是permatations。排列意味着玩家的秩序很重要。

使用扩展方法可以生成组合:

public static IEnumerable<IEnumerable<T>> Combinations<T>(this IEnumerable<T> elements, int k) {
    return k == 0 ? new[] { new T[0] } :
      elements.SelectMany((e, i) =>
        elements.Skip(i + 1).Combinations(k - 1).Select(c => (new[] { e }).Concat(c)));
}

因此,对于您的示例问题,请设置参数:

var N = 14;
var NumTeams = 3;
var NumPlayersPerTeam = 3;

首先,您可以生成所有玩家:

var players = Enumerable.Range(1, N);

然后,您可以通过一次组合玩家NumPlayersPerTeam来获得所有可能的团队:

var AllTeams = players.Combinations(NumPlayersPerTeam);

然后,您可以通过一次组合团队NumTeams来获得所有团队:

var PossibleTeamSets = AllTeams.Combinations(NumTeams);