比赛支架放置算法
问题内容:
给定对手种子的列表(例如种子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仅在决赛中相遇。
问题答案:
我想出了以下算法。它可能不是超级高效,但我认为它确实不是必须的。它是用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);
}
?>