固定轮转编排法 固定轮转法也叫常规轮转法,是我国传统的编排方法。它以左边第一号固定不动,逆时针转动,逐一排出。
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]; //将最后一队的值赋给临时变量$templistfor ($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]);}}}