阵列中组合的配对算法



我很难找到一种将玩家配对的算法。

假设每一轮比赛后都会产生新的配对,评分最高的总是相互比赛,但他们新的会相互比赛两次。

假设我有以下玩家P1、P2、P4、P12、P14和P16。阵列描述了他们之前玩过的回合(已经玩了3回合(的玩家。该顺序还描述了当前排名(P1为第一,P16为最后(

P1 = [ 10, 2, 3 ]
P2 = [ 11, 1, 6 ]
P4 = [ 13, 5, 8 ]
P12 = [ 3, 15, 11 ]
P14 = [ 5, 16, 13 ]
P16 = [ 7, 14, 5 ]

你可能会看到,Player1已经和Player2比赛了。此外,14号球员已经与16号球员交手。没有进一步的冲突。

一种方法是循环通过玩家阵列(P1到16(。

P1 --> P2  (not allowed)
P1 --> P4  (Allowed. The Arrays auf P1 and P4 would be appended with the IDs of their opponents)
P2 --> P12 (Allowed, Appending the Arrays auf P2 and P12)
P14 --> P16 (not allowed).

在第一次跑步后,2名没有允许配对的选手。

我现在要说的是,我删除最后找到的配对,删除数组中的配对,并尝试找到不同的组合。

P1 --> P4 (Stays as an allowed pairing from the first loop)
---------
P2 --> P12 (this last allowed pairing would be canceled to find out a different allowed pairing, starting from Player2)
P2 --> P14 (Allowed, Appending the Arrays auf P2 and P14)
P4 --> P16 (Allowed, Appending the Arrays auf P4 and P16)

结果:所有玩家都允许配对。

我的困难在于如何返回到最后一个允许的配对,以取消此配对并从那时开始重新搜索。

随之而来的是我的担忧:在Player2中找不到配对的情况下,这个算法怎么会重新转向第一个允许的配对呢。

我有一种感觉,这是我可以通过递归来解决的问题,但我不知道如何设置这种递归(在这种情况下,递归就是答案(。

感谢您的帮助。

几乎每种语言都有代码示例。

C++/C#/PHP/Java首选:-(

几个提示:

首先,如果(PX,PY(是允许的配对,则(PY,PX(也是允许的配对。

其次,假设生成配对(PX,PY(也生成配对(PY,PX(;Y。请注意,如果你这样做,而不是在为PX寻找新的配对时,你只需要为Y寻找大于X的配对(因为对于所有较低的配对,你应该已经生成了它们(。

您还需要指定更多详细信息。

"假设每一轮比赛后都会产生新的配对,评分最高的总是相互比赛,但他们新的会相互比赛两次">

生成配对究竟应该如何工作,因为这有点难以理解你想要实现什么。

我想我使用了一种不同的方法。

首先,我收集所有可能的组合(忽略历史配对(。然后我检查这个组合元组是否有效。

如果有效,那么我会根据排名之间的距离来衡量最佳组合。

因此,我在这里打开了一个新问题:算法返回所有可能的匹配配对

最新更新