Am nevoie de un algoritm, dar oricat m-am chinuit nu mi-a iesit..
Sa zicem ca am 6 persoane, 1 2 3 4 5 6
Vreau sa desfasor o competitie si vreau sa realizez meciuri intre useri a.i. sa joace fiecare cu fiecare, pe sistemul etape, ca la campionatele de fotbal.
Deci, la 6 jucatori, voi avea 5 etape de cate 3 meciuri fiecare... 5 etape fiindca fiecare jucator trebuie sa joace 5 meciuri..
Fiecare trebuie sa joace cu fiecare doar o singura data, iar un jucator trebuie sa apara intr-o etapa doar o singura data cu un singur meci.
Exemplu pentru 6 jucatori:
Etapa 1:
1-2
3-4
5-6
Etapa 2:
1-3
2-5
4-6
Etapa 3:
1-4
2-6
3-5
Etapa 4:
1-5
2-4
3-6
Etapa 5:
1-6
2-3
4-5
Vreau un algoritm care sa-mi faca aceste etape automat, orice numar par i-as da.
Playerii ii am intr-un array $p.
Meciurile vreau sa le tin tot intr-un array $m, care va contine idhome, idaway, etapa
De ex meciul 1 va fi : $m[0]['idhome'] = 1; $m[0]['idaway'] = 2; $m[0]['etapa'] = 1;
Ce am realizat pana acum si merge doar pe o parte din exemple:
Va rog frumos, m-am chinuit cateva ore bune, si am reusit doar in proportie de 50%, dar cu un cod foarte complicat. Merge doar pe numerele: 4,6,8,16,32,64,etc. Vreau sa mearga pe orice numar par.Cod PHP:<?
$jucatori = 6;
$m = array();
$etapa = array();
$count = 1;
for($i=1; $i<=$jucatori; $i++)
for($j=$i+1; $j <= $jucatori; $j++)
{
$m[$count]['idhome'] = $i;
$m[$count]['idaway'] = $j;
$m[$count]['phase'] = 0;
$count++;
}
$meciuri = $jucatori * ($jucatori -1) / 2;
$nretapa = 1;
$last = 2;
$nr=0;
while($nretapa <= $jucatori -1)
{ //generez pt toate etapele
while(count($etapa) < $jucatori)
{
//in array-ul $etapa bag o noua valoare pt fiecare user care a fost bagat corect in etapa curenta..si daca numarul jucatorilor inscrisi este identic cu nr de jucatori, trec la etapa urmatoare
for($i=1; $i <= $meciuri && count($etapa) < $jucatori; $i++)
{
if(!$etapa[$m[$i][idhome]] && !$etapa[$m[$i][idaway]] && $last != $i )
{ //daca amandoi playerii nu au jucat in etapa curenta....in cazul in care $last exista, trebuie sa ignoram elementul $last, intrucat se face un loop infinit - ultimul meci e pus si nu poate fi adaugat in 2 etape
if($m[$i]['phase'] == '0')
{
//daca meciul nu exista in nicio faza
$etapa[$m[$i][idhome]] = 1;
$etapa[$m[$i][idaway]] = 1;
$m[$i]['phase'] = $nretapa;
$last = $i;
$nr ++;
}
else
if($last && (count($etapa) + 2) == $jucatori)
{
//daca meciul este ultimul si nu mai exista alte posibilitati, resetam ultimul meci avut pentru a incerca alte posibilitati.
$m[$last]['phase'] = 0;
unset($etapa[$m[$last][idhome]]);
unset($etapa[$m[$last][idaway]]);
$i=1;
$nr--;
}
}
}
}
$etapa = array();
$nretapa ++;
//urmatoarea etapa si resetam last
unset($last);
}
//******** sortarea dupa faza si intoarcerea in fazele pare, pt ca toti sa fie odata gazde odata oaspeti
do
{
$f = 1;
for($i=1; $i<$meciuri; $i++)
{
if($m[$i]['phase'] > $m[$i+1]['phase'])
{
$aux = array();
$aux = $m[$i];
$m[$i] = $m[$i+1];
$m[$i+1] = $aux;
$f=0;
}
if($m[$i]['phase'] % 2 == 0)
{
$aux = $m[$i]['idhome'];
$m[$i]['idhome'] = $m[$i]['idaway'];
$m[$i]['idaway'] = $aux;
}
}
}
while(!$f);
//******* sortarea dupa faza
/*
//afisarea
echo '<br /><br /><br /><br />';
$count = 0;
$etapa = 1;
echo "Etapa $etapa<br />";
$etapa++;
for($i=1;$i<=$meciuri;$i++)
{ if($count == $jucatori / 2)
{
echo "<br />";
echo "Etapa $etapa<br />";
$count = 0;
$etapa++;
}
echo $m[$i]['idhome'] . ' - ' . $m[$i]['idaway'] . ' ( faza: ' . $m[$i]['phase'] . ')<br />';
$count++;
}
*/
?>
Va multumesc foarte mult!




Răspunde cu citat
