单循环比赛

文章介绍了两种比赛编排方法:固定轮转法和贝格尔编排法,并提供了PHP代码实现。固定轮转法保持左边第一号不变,逆时针轮转。贝格尔法则根据队伍数量进行编排,每轮特定号码会移动。代码详细展示了这两种方法的逻辑过程。
摘要由CSDN通过智能技术生成
固定轮转编排法 固定轮转法也叫常规轮转法,是我国传统的编排方法。它以左边第一号固定不动,逆时针转动,逐一排出。
    public function fixedRotation()
    {
        $teamlist = [1, 2, 3, 4, 5,6, 0];//参赛的各队
        $len = count($teamlist);
        for ($i = 1; $i < $len; $i++) {
            var_dump("第" . $i . "轮");
            for ($j = 0; $j < $len / 2; $j++) {
                if($teamlist[$j] == $teamlist[$len-1-$j]){
                    continue;
                }
                var_dump($teamlist[$j] . " ----- " . $teamlist[$len-1-$j]);
            }
            $templist = $teamlist[$len - 1]; //将最后一队的值赋给临时变量$templist
            for ($k = $len-1; $k > 0; $k--) {
                $teamlist[$k] = $teamlist[$k-1];
            }
            $teamlist[1] = $templist; //将临时变量$templist赋给数组的第二值
        }
    }

2、采用“ 贝格尔”编排法,编排时如果参赛队为双数时,把参赛队数分一半(参赛队为单数时,最后以“0”表示形成双数),前一半由1号开始,自上而下写在左边;后一半的数自下而上写在右边,然后用横线把相对的号数连接起来。这即是第一轮的比赛。

第二轮将第一轮右上角的编号(“0”或最大的一个代号数)移到左角上,三轮又移到右角上,以此类推。

即单数轮次时“0”或最大的一个代号在右上角,双数轮次时则在左上角。如下表示:

7个队比赛的编排方法

第一轮    第二轮   第三轮   第四轮    第五轮   第六轮    第七轮

1-0  0-5  2-0  0-6  3-0  0-7  4-0

2-7  6-4  3-1  7-5  4-2  1-6  5-3

3-6  7-3  4-7  1-4  5-1  2-5  6-2

4-5  1-2  5-6  2-3  6-7  3-4  7-1

无论比赛队是单数还是双数,最后一轮时,必定是“0”或最大的一个代号在右上角,“1”在右下角。

根据参赛队的个数不同,“1”朝逆时针方向移动一个位置时,应按规定的间隔数移动(见表),“0”或最大代号数应先于“1”移动位置(目前3队以下有bug后续再解决)

public function Berger()
    {
        $list = [];
        $teamList = [1, 2, 3];
        //参赛队数数量
        $len = count($teamList);
        //比赛轮次
        $turns = $len - 1;
        //如果为奇数,用0补空
        if ($len % 2) {
            array_push($teamList, 0);
            $turns = $len;
        }
        array_push($list, $teamList);
        $max = $teamList[count($teamList) - 1];
        //间隔数,计算公式为(n-4)/2+1
        $steps = (int)($len <= 4 ? 1 : ($len - 4) / 2 + 1);
        $parseList = $teamList;
        for ($n = 0; $n < $turns; $n++) {
            //移除空位
            $isMax = $parseList[0] == $max;
            unset($parseList[$parseList[0] == $max ? 0 : count($parseList) - 1]);
            $tempArray = array_values($parseList);
            $templen = count($tempArray);
            $tempLen = $isMax ? $steps + 2 : $steps;
            for ($i = 0; $i < $tempLen; $i++) {
                //右位移
                $temp = $tempArray[$templen - 1];
                for ($j = $templen - 2; $j >= 0; $j--) {
                    $tempArray[$j + 1] = $tempArray[$j];
                }
                $tempArray[0] = $temp;
            }
            //补空位
            if ($isMax) array_push($tempArray, $max);
            else  array_unshift($tempArray, $max);
            $parseList = $tempArray;
            array_push($list, $tempArray);
        }
        //分队
        for ($i = 0; $i < count($list); $i++) {
            var_dump("第" . $i . "轮");
            $ar = $list[$i];
            $length = count($ar) / 2;
            $left = $right = [];
            for ($j = 0; $j < $length; $j++) {
                $left[$j] = $ar[$j];
                $right[$j] = $ar[$j + $length];
            }
            $right = array_reverse($right);
            for ($j = 0; $j < count($left); $j++) {
                var_dump($left[$j] . '----------' . $right[$j]);
            }
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值