当前位置: 首页 > 知识库问答 >
问题:

如何在循环赛中配对?

穆子琪
2023-03-14

我正在制作一个锦标赛应用程序,其中多个(4,6,或8)的球员将相互匹配。

它是以圆为基础的。因此,如果一共有6名选手,那么将有5轮比赛,每轮比赛有3对选手。每个球员每轮只能出现一次。

我一直在使用for-loops来获得所需的组合,但是我如何将这些对分离成循环,这样它们就不会重复了呢?以下是我到目前为止所做的(制作每一个组合):

<?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...

共有1个答案

章子航
2023-03-14

你可以用这个代码。它基于循环的调度算法:

$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处。

 类似资料:
  • 问题内容: 如果我在一个循环中有一个循环,并且一旦满足一条语句,我想中断主循环,那我应该怎么做? 这是我的代码: 问题答案: 使用标记的中断: 另请参阅 Java代码中的“循环:”。 这是什么,为什么会编译? 文献资料

  • 问题内容: 刚接触React并尝试循环对象属性,但是React抱怨对象不是有效的React子对象,有人可以给我一些如何解决此问题的建议吗?我添加了createFragment,但不确定是否需要执行此操作或应该采用哪种方法? JS 渲染功能 控制台错误 问题答案: 问题在于您的使用方式,因为它总是会返回。您可能正在寻找返回新数组的方法: 如果仍然要使用,则必须执行以下操作: 更新: 如果您正在编写E

  • 我试图从以下JSON对象数据中检索信息。json: 因此,我想循环这个JSON对象,以显示所有可用项及其相应的标题、说明和附件链接。 我知道我可以分别访问它们: 通常我会对数据进行for循环和循环。项目[i]。但是,由于这是一个react和一个对象,而不是一个数组,因此它的工作方式不同。 我当前的代码: 现在它只显示对象的第一个条目(因为它有const项目=data.items[0])我如何循环d

  • 问题内容: 我正在谈论做类似的事情: 我可以想到一些在python中执行此操作的方法(使用和来创建和反转它的列表,…),但我想知道是否存在更优雅的方法。在那儿? 编辑:有人建议我使用xrange()而不是range(),因为range返回一个列表,而xrange返回一个迭代器。但是在Python 3(我碰巧使用过)中,range()返回一个迭代器,而xrange不存在。 问题答案: 并采用指定步骤

  • 我正试图做一个项目的投资组合,也有一个小博客。我想为我的项目使用“页面”,为我的博客文章使用普通文章。我正在尝试循环页面,但不断出现错误。 这是我的代码: 我一直得到的错误是: 致命错误:未捕获错误:调用成员函数have_posts()在C:\xampp\htdocs\ivannikolov\wp-内容\主题\port18\index.php:31堆栈跟踪:#0 C:\xampp\htdocs\i

  • 我一直在寻找如何弄清楚如何让一个输入或某些东西进入一个time循环。就像在,输入()命令不会停止我的秒表。我尝试过tkinter、pygame和其他几种方法,但它们都不起作用。如果有人能帮我,我更喜欢小而简单的东西,如果这是可能的话。具体来说,我想学习做什么,基本上是允许在按下任何键时立即停止(最好不按回车键)。谢谢,马鞍猪! 以下是我到目前为止的情况,没有任何东西可以激活停止: