PHP赛事贝格尔编排法--双循环

//贝格尔编排法
function berger(){
    // 双循环

        // 根据队伍数量生成数组
        $num = 10;
        $ar = [];
        for ($i = 1; $i <= $num; $i++) {
            $ar[] = $i;
        };
        // halt($numArr);
        // $ar = array('1', '2', '3', '4', '5', '6' ,'7','8','9');直接传入数组或者选手名称或者id或者标识
        if (count($ar) % 2) $ar[] = '0';
        $t = array_merge(range(1, count($ar) - 1), range(1, count($ar) - 1));
        $len = count($ar);
        $m = range(1, $len);
        $lun = 0;
        $last = 0;
        $k = $len <= 4 ? 1 : ($len - 4) / 2 + 1;
        while ($lun++ < ($len - 1) * 2) {
            $s = array_values($m);
            echo "== 第$lun" . "轮 ==</br>";
            for ($i = 0; $i < $len / 2; $i++) {
                printf("%s -- %s </br>", $ar[$s[$i] - 1], $ar[$s[$len - 1 - $i] - 1]);
            }

            list($m[0], $m[$len - 1]) = array($m[$len - 1], $m[0]);
            for ($i = 0; $i < $k; $i++) {
                if ($m[++$last % $len] == $len) $last++;
            }
            $n = $last %= $len;
            for ($i = 1; $i < $len; $i++) {
                if (($m[$n]) == $len) $n = ($n + 1) % $len;
                $m[$n] = $i;
                $n = ($n + 1) % $len;
            }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值