如何在PHP中实现无重复的球员两两配对?
实现FIFA18杯赛球员两两配对的解决方案
嘿,你已经搞定了场次计算的核心部分,现在只需要添上生成具体配对的逻辑就大功告成啦!咱们直接来解决这个问题:
核心思路:生成无重复的两两配对
要实现无重复、无自战的配对,最直接高效的方式是用嵌套循环:外层遍历每个球员,内层只遍历当前球员之后的所有球员——这样既不会出现A vs B和B vs A的重复配对,也绝对不会出现球员和自己对战的情况。
整合到你的现有代码中
我把配对逻辑加到了你的代码里,同时还优化了场次计算的部分(用更简洁的组合公式代替阶乘,避免大数溢出问题):
<?php require("server/baza.php"); $przelacznik = 1;//$_POST['losuj']; $zapytanie = "select nick from mecze"; if($przelacznik == 1){ $wynik = mysqli_query($polaczenie,$zapytanie); $tab = array(); $n=0; // 从数据库读取球员列表 while($wiersz = mysqli_fetch_assoc($wynik)){ array_push($tab,$wiersz['nick']); $n++; } // 优化场次计算:用组合数简化公式代替阶乘,更高效安全 $ilosc_rozgrywek = $n * ($n - 1) / 2; // 生成所有无重复配对 $pairings = array(); for ($i = 0; $i < $n; $i++) { // 内层循环从i+1开始,彻底避免重复和自战 for ($j = $i + 1; $j < $n; $j++) { // 用数组存储配对,方便后续灵活使用 $pairings[] = array( 'player1' => $tab[$i], 'player2' => $tab[$j] ); // 如果需要直接生成字符串格式,也可以这样写: // $pairings[] = $tab[$i] . " vs " . $tab[$j]; } } // 示例:输出所有配对结果 echo "总共需要进行 {$ilosc_rozgrywek} 场比赛:<br>"; foreach ($pairings as $match) { echo "{$match['player1']} vs {$match['player2']}<br>"; } } ?>
关键细节说明
- 配对逻辑:外层循环
$i控制第一个球员,内层循环$j从$i+1开始,确保每个配对只生成一次(比如P1 vs P2只会出现一次,不会反过来生成P2 vs P1)。 - 场次计算优化:原来的阶乘计算在球员数量较多时容易出现数值溢出,而
n*(n-1)/2是组合数C(n,2)的简化公式,结果完全一致但更高效安全。 - 配对存储:用数组存储每个配对的两个球员,后续你可以更灵活地使用这些数据(比如存入数据库、生成可视化赛程表等),如果需要直接输出字符串格式,也可以改成注释里的写法。
内容的提问来源于stack exchange,提问作者shapir
相关产品推荐
相关产品推荐

