Сделал скрипт создания расписания чемпионата футбольных команд.
Код | class Controller_Rasp extends Controller_Base{ private $already=array(); private $checks=array('home'=>array(), 'away'=>array()); private $got_ids=array(); function index(){ $con=''; $a=$this->get_rasp('div1'); foreach ($a as $t => $m){ $con.="$t тур<br>"; $l=1; foreach ($m as $v){ $con.=$l." $v[0] - $v[1]<br>"; $l++; } $con.="<hr>"; } $con.=$this->m->arr($a); $this->m['sm']->assign('title', 'Расписание'); $this->m['sm']->assign('main_con', $con); $this->m['sm']->display('index.tpl'); } // Берем айди команд из базы private function get_teams($d){ $res=$this->m['db']->prepare("select id from teams where d='$d'"); $res->execute(); $r=$res->fetchAll(PDO::FETCH_ASSOC); foreach ($r as $v){ $t[]=$v['id']; } return $t; } // Составляем пары команд (должно быть 8*15 8 пар 15 туров в первом круге) private function get_rasp($d){ $t=$this->get_teams($d); $num=0; foreach ($t as $v){ $this->already[]=$v; foreach ($t as $v1){ if (in_array($v1, $this->already)) continue; $rasp[]=array($v, $v1); $num++; } if ($num==120) break; } return $this->check($rasp); } // Команда должна играть не более 8 раз дома в течение круга private function check($r){ unset($this->checks['home']); unset($this->checks['away']); foreach($r as $k => $v){ if (!isset($this->checks['home'][$v[0]])) $this->checks['home'][$v[0]]=0; $this->checks['home'][$v[0]]++; if ($this->checks['home'][$v[0]]>8){ $r[$k]=array($v[1], $v[0]); } } return $this->check_turs($r); } // разбиваем расписание на туры private function check_turs($r){ shuffle($r); $turs=array(); for ($tur=1; $tur<=30; $tur++){ if ($tur==16) { shuffle($r); $this->got_ids=array(); } $turs[$tur]=$this->get_tur($r, $tur); } return $turs; } // Получаем пары определенного тура private function get_tur($r, $t){ $checked_ids=array(); $tur=array(); foreach ($r as $k=>$v){ if (in_array($k, $this->got_ids) || in_array($v[0], $checked_ids) || in_array($v[1], $checked_ids)){ continue; } $this->got_ids[]=$k; $checked_ids[]=$v[1]; $checked_ids[]=$v[0]; if ($t<16){ $tur[]=$v; } else $tur[]=array_reverse($v); if (count($tur)==8) break; } return $tur; } }
|
Вроде все нормально, но в некоторых турах получается 7 пар вместо 8, а иногда меньше. Может я не правильно алгоритм придумал?
PS И может кто подскажет как сделать так чтоб одна команда не играла больше 2 раз подряд дома...
|