алгоритм циклического перебора одинакового распределения вдали от дома в Stack Overflow

Я искал это решение, и есть несколько документов, но не смог получить их правильно. Пожалуйста, посмотрите. Я попытался реализовать алгоритм циклического перебора, чтобы создать расписание матчей, но в стеке у себя дома.

$allTeam=[3,10,8,7];
$leng=sizeof($allTeam);
$lastHalf=$leng-1;
for ($t=0; $t <$leng-1 ; $t++) {
for ($i=0; $i < $leng/2; $i++) {
if($t % 2== 0){
\Log::info('Home Team => '.$allTeam[$i].' vs '.  $allTeam[$lastHalf-$i].'<=Away Team');
}else{
\Log::info('Away Team =>'.$allTeam[$i].' vs '.  $allTeam[$lastHalf-$i].'<= Home Team');
}

}

/*now rotate the array. For this first insert the last item into postion 1*/
array_splice( $allTeam, 1, 0, $allTeam[$leng-1]);
/*now pop up the last element*/
array_pop($allTeam);
}

это результат

Home Team => 3 vs 7<=Away Team
Home Team => 10 vs 8<=Away Team

Away Team =>3 vs 8<= Home Team
Away Team =>7 vs 10<= Home Team

Home Team => 3 vs 10<=Away Team
Home Team => 8 vs 7<=Away Team

Вы можете видеть, что это не одинаково распределено.
Как я могу убедиться, что если одна команда играет в качестве домашней команды в первом раунде, то эта команда должна отыграть в следующем раунде? Точно так же, если в первом раунде, то дома в следующем?

Спасибо.

0

Решение

Это проще, чем то, что вы делаете, если вы просто создаете каждую перестановку, то каждая команда будет играть дома и проводить равное количество раз между командами, поэтому, если у вас будет 4 команды, у вас будет 3 дома на 3, генерация будет выполнена. лайк:

<?php
$allTeam = [3, 10, 8, 7];

$result = [];
foreach ($allTeam as $home) {
foreach ($allTeam as $away) {
if ($home === $away) {
continue;
}
$result[] = 'Home Team => '.$home.' vs '.$away.' <= Away Team';
}
}

print_r($result);

https://3v4l.org/EAl8G

Результат:

Array
(
[0] => Home Team => 3 vs 10 <= Away Team
[1] => Home Team => 3 vs 8 <= Away Team
[2] => Home Team => 3 vs 7 <= Away Team
[3] => Home Team => 10 vs 3 <= Away Team
[4] => Home Team => 10 vs 8 <= Away Team
[5] => Home Team => 10 vs 7 <= Away Team
[6] => Home Team => 8 vs 3 <= Away Team
[7] => Home Team => 8 vs 10 <= Away Team
[8] => Home Team => 8 vs 7 <= Away Team
[9] => Home Team => 7 vs 3 <= Away Team
[10] => Home Team => 7 vs 10 <= Away Team
[11] => Home Team => 7 vs 8 <= Away Team
)

Тогда у вас будет еще один цикл, который сортирует их таким образом, чтобы он выглядел как сценарий дома -> далеко -> дом -> далеко.

1

Другие решения

Я решил это с некоторой модификацией. Вот мой окончательный код. Это может помочь другим

$allTeam=[1,2,3,4];
/*now make the draw and insert it in the table*/
$leng=sizeof($allTeam);
$firstHalf=0;
$lastHalf=$leng-1;

$isHome=true;
for ($t=0; $t <$leng-1 ; $t++) {
for ($i=0; $i < $leng/2; $i++) {
if($i==0){
if($isHome){
\Log::info('Home team=> '.$allTeam[$i].' vs Away team=> '.$allTeam[$lastHalf-$i]);
$isHome=false;
}else{
\Log::info('Home team=> '.$allTeam[$lastHalf-$i].' vs Away team=> '.$allTeam[$i]);
$isHome=true;
}
}else{
if($i%2==0){
/*make first half home team*/
\Log::info('Home team=> '.$allTeam[$i].' vs Away team=> '.$allTeam[$lastHalf-$i]);

}else{
\Log::info('Home team=> '.$allTeam[$lastHalf-$i].' vs Away team=> '.$allTeam[$i]);
}
}


}
/*now rotate the array. For this first insert the last item into postion 1*/
array_splice( $allTeam, 1, 0, $allTeam[$leng-1]);
/*now pop up the last element*/
array_pop($allTeam);

}
0

По вопросам рекламы [email protected]