用PHP创建游戏日程比我想象的要难
我有一个长度未知的数组,它总是有一个可等分的值,例如:用PHP创建游戏日程比我想象的要难,php,arrays,multidimensional-array,unique,permutation,Php,Arrays,Multidimensional Array,Unique,Permutation,我有一个长度未知的数组,它总是有一个可等分的值,例如: print_r($initialarray); Array ( [0] => 30 [1] => 31 [2] => 32 [3] => 33 [4] => 34 [5] => 35 ) 我需要创建集合: 值的顺序除以v表示它们是一个集合。集合中值的顺序无关紧要(我从脑海中随机地把它们放在一起)。正如您所看到的,在任何其他集合或同一集合内都不可能存在匹配的重复集合 我尝试了很多不同的方法,想找到
print_r($initialarray);
Array ( [0] => 30 [1] => 31 [2] => 32 [3] => 33 [4] => 34 [5] => 35 )
我需要创建集合:
值的顺序除以v表示它们是一个集合。集合中值的顺序无关紧要(我从脑海中随机地把它们放在一起)。正如您所看到的,在任何其他集合或同一集合内都不可能存在匹配的重复集合
我尝试了很多不同的方法,想找到一些有效的方法。
我得到的最接近的结果是将初始值放入包含所有可能有效匹配的级联数组中:
Array ( [0] => Array ( [0] => 35 [1] => 31 ) [1] => Array ( [0] => 34 [1] => 31 ) [2] => Array ( [0] => 33 [1] => 31 ) [3] => Array ( [0] => 32 [1] => 31 ) )
Array ( [0] => Array ( [0] => 35 [1] => 32 ) [1] => Array ( [0] => 34 [1] => 32 ) [2] => Array ( [0] => 33 [1] => 32 ) )
Array ( [0] => Array ( [0] => 35 [1] => 33 ) [1] => Array ( [0] => 34 [1] => 33 ) )
Array ( [0] => Array ( [0] => 35 [1] => 34 ) )
这些值是一个名为$sched的数组中的数组。
我在数组中留下了30个。。哎呀
数字是团队。每个队需要和每个队比赛一次。赛程安排将确保每支球队每周只打一场比赛。
需要在几周内设置时间表,以便在一周内不让一支球队进行一次以上比赛的情况下进行所有比赛。
我已经使用了一个置换函数,这就是我如何得到上面没有相同匹配的数组的原因。我现在需要弄清楚如何输出如上所示的计划。(请记住,只要没有一支球队在同一场比赛中打两次,那么这个例子的顺序并不重要)
$count=count($initialarray);
$recont=$count-1;
对于($u=0;$u<$count;$u++){
对于($d=0;$d你可以用每一个“游戏”构建一个数组,就像
0 => 30 v 35
1 => 31 v 34
2 => 32 v 33
这应该很容易。然后你只需通过这个数组,把游戏放在第一排,没有任何一个团队已经在玩了。可能有更好更快的解决方案,但这是我想到的第一个,我认为写起来很简单。我没有一个直接的答案,但看起来你可能需要一点一点图论。也许这段代码可以解决您的问题,它并没有它可能的那么优雅,但它似乎可以工作。
你应该知道何安排游戏工作;)
也许你需要注意安排球员日。只有当两名球员当天都没有安排好比赛时,才可以在一天内安排好各种比赛。
另一个函数只是为了使代码更具可读性(并覆盖arrangePlayerforDays中的一对小故障)
函数gamePrettyPrint($gamesOnADay,$glue){
$result=array();
foreach($gamesOnADay作为$currentGame)
$result[]=join($glue,$currentGame);
返回$result;
}
函数安排日期($day){
$result=array();
对于($k=0,$limit=count($day);$k问题是否有您想要的答案?$team=array(1=>30,2=>31,3=>32,4=>33,5=>34,6=>35);
$team = array( 1 => 30 , 2 => 31 , 3 => 32 , 4 => 33 , 5 => 34 , 6 => 35 );
$numplayers = count($team);
if ($numplayers % 2 != 0) $numplayers++;
for ($round = 0;$round < $numplayers - 1;$round++) {
echo 'Set ' . ($round+1) . ":\n\n{$team[1]}-";
for ($i = 0;$i < $numplayers-1;$i++) {
if ($i % 2 == 0) {
$player = ($numplayers-2) - ($i/2) - $round;
} else {
$player = ((($i-1)/2) - $round);
}
if ($player < 0) $player += $numplayers - 1;
echo $team[$player+2];
echo ($i % 2 == 0) ? "\n" : '-';
}
echo "\n\n<br/>";
}
$numplayers=计数($team);
如果($numplayers%2!=0)$numplayers++;
对于($round=0;$round<$numplayers-1;$round++){
echo“Set.”($round+1)。“:\n\n{$team[1]}-”;
对于($i=0;$i<$numplayers-1;$i++){
如果($i%2==0){
$player=($numplayers-2)-($i/2)-$round;
}否则{
$player=(($i-1)/2)-$round;
}
如果($player<0)$player+=$numplayers-1;
echo$团队[$玩家+2];
回音($i%2==0)?“\n”:“-”;
}
回声“\n\n
”;
}
0 => 30 v 35
1 => 31 v 34
2 => 32 v 33
function gamePrettyPrint($gamesOnADay, $glue) {
$result=array();
foreach ($gamesOnADay as $currentGame)
$result[]=join($glue,$currentGame);
return $result;
}
function arrangeGamesOnAday($day) {
$result=array();
for ($k=0, $limit=count($day); $k<$limit; $k+=2)
$result[]=array($day[$k+1], $day[$k]);
return $result;
}
function arrangeGames($players) {
for ($i=0, $limit=count($players); $i < $limit; $i++)
for ($j=$i+1; $j<$limit;$j++)
$games[]=array($players[$i], $players[$j]);
return $games;
}
function calculateTournamentDuration($players) {
return count($players)-1; // (n!)/(2!*(n-2)!) * (1/n)
}
function arrangePlayerforDays($games, $days) {
$mem = array_pad(array(),$tournamentDays,array());
for ($k=0;count($games);$k++)
if ((array_search($games[0][0],$mem[$k%$days])=== false) and
(array_search($games[0][1],$mem[$k%$days])=== false))
list($mem[$k%$days][], $mem[$k%$days][]) = array_shift($games);
return ($mem);
}
function scatterGamesOnCalendar($games, $tournamentDays) {
$days=arrangePlayerforDays($games, $tournamentDays);
$calendar=array_map('arrangeGamesOnAday',$days);
return $calendar;
}
// $initialArray = array('a','b','c','d','e','f','g','h');
$initialArray = array(30,31,32,33,34,35);
$games= arrangeGames($initialArray);
$tournamentSpan = calculateTournamentDuration($initialArray);
$calendar = scatterGamesOnCalendar($games, $tournamentSpan);
while ($day=array_shift($calendar))
$prettyCalendar[]=gamePrettyPrint($day,' v ');
print_r($prettyCalendar);
$team = array( 1 => 30 , 2 => 31 , 3 => 32 , 4 => 33 , 5 => 34 , 6 => 35 );
$numplayers = count($team);
if ($numplayers % 2 != 0) $numplayers++;
for ($round = 0;$round < $numplayers - 1;$round++) {
echo 'Set ' . ($round+1) . ":\n\n{$team[1]}-";
for ($i = 0;$i < $numplayers-1;$i++) {
if ($i % 2 == 0) {
$player = ($numplayers-2) - ($i/2) - $round;
} else {
$player = ((($i-1)/2) - $round);
}
if ($player < 0) $player += $numplayers - 1;
echo $team[$player+2];
echo ($i % 2 == 0) ? "\n" : '-';
}
echo "\n\n<br/>";
}