给定对手种子的列表(例如种子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); } ?>