是否有任何算法可以使轮回时间表具有每个轮回唯一的组合?

时间:2019-06-24 06:28:50

标签: php algorithm fixtures

假设我有10位参与者[1,2,3,4,5,6,7,8,9,10]

假设一个联赛有10个参与者,那么每个参与者将与其他9个参与者进行9场比赛。

因此,将有9个回合,每个参与者单场比赛。例如-

第一回合:1-2、3-4、5-6、7-8、9-10 [任何参与者均不可重复]

第二轮:1-3、2-4、5-7、8-9、6-10 [任何参与者均不可重复]

以此类推。

那里有任何数学算法解决方案/模式吗?

如果可能,我想避免使用数组推/弹出方法。

1 个答案:

答案 0 :(得分:2)

是的,有一种相当简单的算法可以生成所有可能的对((N-1)*N/2
将项目分成两行。
在每一轮中,第一排的玩家都会与下排的玩家进行比赛。
修复第一个。
循环移动所有其他内容。

请注意,您可以使用数组索引,而不更改其内容

A  B
D  C
pairs A-D, B-C

A  D
C  B
pairs A-C, D-B

A  C
B  D
pairs A-B, C-D

我在PHP(ideone)中的幼稚实现会输出玩家的索引:

function GenPairs($N) {
    for ($i=0; $i<$N-1;$i++){
        echo(0).":";
        echo($N - 1 - $i)."\n";
        for ($j=1; $j<$N/2;$j++){
            echo(1 + (($N - $i + $j - 2) % ($N - 1))).":";
            echo(1 + ((2*$N - $i - $j - 3) % ($N - 1)))."\n";
        }
            echo("\n");
    }
}    


GenPairs(6);

0:5
1:4
2:3

0:4
5:3
1:2

0:3
4:2
5:1

0:2
3:1
4:5

0:1
2:5
3:4