Php 如何在循环赛中配对?
我正在制作一个锦标赛应用程序,其中有许多(4、6或8)玩家将相互匹配 它是圆形的。因此,如果总共有6名玩家,那么将有5轮,每轮3对。每名球员每轮只能出场一次 我试过的 我一直在使用for循环来获得所需的组合,但是我如何才能将成对的循环分开,这样它们就不会重复?以下是我到目前为止所做的工作(制作每一个组合):Php 如何在循环赛中配对?,php,arrays,for-loop,combinations,combinatorics,Php,Arrays,For Loop,Combinations,Combinatorics,我正在制作一个锦标赛应用程序,其中有许多(4、6或8)玩家将相互匹配 它是圆形的。因此,如果总共有6名玩家,那么将有5轮,每轮3对。每名球员每轮只能出场一次 我试过的 我一直在使用for循环来获得所需的组合,但是我如何才能将成对的循环分开,这样它们就不会重复?以下是我到目前为止所做的工作(制作每一个组合): 您可以使用此代码。其依据是: 循环中发生的循环移位可以这样可视化,其中数组被“折叠”一半,以显示谁与谁配对(在列中): 玩家1从不移动,位置2的玩家被从阵列中切掉,推到阵列的末端,这意味着
您可以使用此代码。其依据是:
循环中发生的循环移位可以这样可视化,其中数组被“折叠”一半,以显示谁与谁配对(在列中):
玩家1从不移动,位置2的玩家被从阵列中切掉,推到阵列的末端,这意味着它将到达位置6。作为旁注,$j==$i
是一个不可能的条件,因为$j<$i
;)如果你真的找不到解决方案,可以洗牌玩家,然后根据你手工找到的解决方案硬编码顺序。这是一个非常糟糕的答案,所以我不会把它作为一个答案发布,这样我就不会被否决:英语不是我的第一语言,所以我不知道这叫做循环算法。非常感谢您的宝贵建议和解决方案。
<?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"
]*/
$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];
[
[[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]]
]