如何在循环赛中配对?
How to match up pairs in a round robin tournament?
我正在制作一个锦标赛应用程序,可以让许多(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"
]*/
我的问题
是否有任何通用的方法可以将配对分配到回合中,同时玩家不会在同一回合中出现超过一次?
示例
- 1st 回合:12、34、56;
- 2nd 回合:13、25、46...
您可以使用此代码。它基于 the scheduling algorithm for round robin:
$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]]
]
循环中发生的循环转换,可以像这样可视化,其中数组 "folded" 中途也显示谁与谁配对(在列中):
玩家1永远不会移动,位置2的玩家被切出数组,推到数组的末尾,这意味着它会到达位置6。
我正在制作一个锦标赛应用程序,可以让许多(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"
]*/
我的问题
是否有任何通用的方法可以将配对分配到回合中,同时玩家不会在同一回合中出现超过一次?
示例
- 1st 回合:12、34、56;
- 2nd 回合:13、25、46...
您可以使用此代码。它基于 the scheduling algorithm for round robin:
$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]]
]
循环中发生的循环转换,可以像这样可视化,其中数组 "folded" 中途也显示谁与谁配对(在列中):
玩家1永远不会移动,位置2的玩家被切出数组,推到数组的末尾,这意味着它会到达位置6。