固定轮转编排法 固定轮转法也叫常规轮转法,是我国传统的编排方法。它以左边第一号固定不动,逆时针转动,逐一排出。
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]);
}
}
}