一尘不染

比赛支架放置算法

algorithm

给定对手种子的列表(例如种子1至16),我正在尝试编写一种算法,该算法将导致最高种子在该回合中播放最低的种子,第二种子播放第二低种子,等等。

将1和16、2和15等分组为“比赛”是相当容易的,但是我还需要确保较高的种子在随后的回合中将发挥较低的种子。

具有正确位置的示例括号:

1比16
            1比8
8比9
                        1比4
4比13
            4比5
5比12
                                    1比2
2比15
            2比7
7比10
                        2比3
3比14
            3比6
6比11

如您所见,种子1和2仅在决赛中相遇。


阅读 202

收藏
2020-07-28

共1个答案

一尘不染

我想出了以下算法。它可能不是超级高效,但我认为它确实不是必须的。它是用PHP编写的。

<?php
    $players = range(1, 32);
    $count = count($players);
    $numberOfRounds = log($count / 2, 2);

    // Order players.
    for ($i = 0; $i < $numberOfRounds; $i++) {
        $out = array();
        $splice = pow(2, $i);

        while (count($players) > 0) {

            $out = array_merge($out, array_splice($players, 0, $splice));
            $out = array_merge($out, array_splice($players, -$splice));

        }

        $players = $out;
    }

    // Print match list.
    for ($i = 0; $i < $count; $i++) {
        printf('%s vs %s<br />%s', $players[$i], $players[++$i], PHP_EOL);
    }
?>
2020-07-28