Как подобрать пары в круговом турнире?

Я делаю турнирное приложение, в котором несколько (4, 6 или 8) игроков будут сопоставлены друг с другом.

Это круглая основа. Так, если в общей сложности 6 игроков, то будет 5 раундов по 3 пары в каждом. Каждый игрок может появиться только один раз за раунд.

Что я пробовал

Я использовал циклы for, чтобы получить необходимые комбинации, но как я могу разделить пары на раунды, чтобы они не повторялись? Вот что я сделал до сих пор (создавая каждую комбинацию):

<?php
$players = [1,2,3,4,5,6];

for($i = 0; $i < count($players); $i++):
for($j = 0; $j < $i; $j++):
$pair1 = $players[$j];
$pair2 = $players[$i];
$pairs[] = $pair1.$pair2;
endfor;
endfor;
/* Output:
[
0 => "12"1 => "13"2 => "23"3 => "14"4 => "24"5 => "34"6 => "15"7 => "25"8 => "35"9 => "45"10 => "16"11 => "26"12 => "36"13 => "46"14 => "56"]*/

Мой вопрос

Есть ли какой-нибудь общий способ распределения пар по раундам, чтобы игроки не появлялись более одного раза в одном раунде?

пример

  • 1улица раунд: 12, 34, 56;
  • 2й раунд: 13, 25, 46 …

3

Решение

Вы можете использовать этот код. Он основан на алгоритм планирования для циклического перебора:

$players = [1,2,3,4,5,6];

$n = count($players);
for ($r = 0; $r < $n - 1; $r++) {
for ($i = 0; $i < $n / 2; $i++) {
$rounds[$r][] = [$players[$i], $players[$n-1 - $i]];
}
// Perform round-robin shift, keeping first player in its spot:
$players[] = array_splice($players, 1, 1)[0];
}
// shift once more to put array in its original sequence:
$players[] = array_splice($players, 1, 1)[0];

Обратите внимание, что это помещает пары в подмассивы. Не стоит объединять их как строки, так как это только усложнит извлечение отдельных чисел из них снова.

После запуска приведенного выше кода массив $rounds является:

[
[[1,6],[2,5],[3,4]]
[[1,2],[3,6],[4,5]]
[[1,3],[4,2],[5,6]]
[[1,4],[5,3],[6,2]]
[[1,5],[6,4],[2,3]]
]

Сдвиг циклического перебора, который происходит в цикле, можно визуализировать следующим образом, где массив «свернут» на полпути, чтобы также показать, кто в паре с кем (в столбцах):

введите описание изображения здесь

Игрок 1 никогда не двигается, игрок на месте 2 вырезается из массива и помещается в конец массива, что означает, что он прибудет на место 6.

4

Другие решения

Других решений пока нет …