1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| std::vector<int> EquipeVector;
for(int i = 1; i <= nbEquipes; ++i)
{ // On ajoute tous les numéros d'équipe dans un vecteur
EquipeVector.push_back(i);
}
std::srand(unsigned(std::time(0))); // Randomize
// Une map qui contient une équipe ainsi que ces cinq adversaires
std::map< int, std::vector<int> > EquipeAdversaire;
for(int EquipeCourante = 1; EquipeCourante <= nbEquipes; ++EquipeCourante)
{
// On mélange le tout
std::random_shuffle(EquipeVector.begin(), EquipeVector.end());
// On va itérer les équipes pour trouver nos cinq adversaires
for(std::vector<int>::iterator EquipeVectorIt = EquipeVector.begin();
EquipeVectorIt != EquipeVector.end(); ++EquipeVectorIt)
{
if(EquipeAdversaire[EquipeCourante].size() >=5)
{ // On a déjà nos 5 adversaires
EquipeVector.erase(std::find(EquipeVector.begin(), EquipeVector.end(), EquipeCourante));
break;
}
const int AdversairePotentiel = *EquipeVectorIt;
if(EquipeCourante == AdversairePotentiel)
{ // On ne peut pas jouer contre soi-même
continue;
}
if(std::find(EquipeAdversaire[AdversairePotentiel].begin(),
EquipeAdversaire[AdversairePotentiel].end(), EquipeCourante) !=
EquipeAdversaire[AdversairePotentiel].end())
{ // On a déjà jouer contre cet adversaire
continue;
}
if(EquipeAdversaire[AdversairePotentiel].size() < 5)
{ // Notre adversaire potentiel n'a pas cinq parties, on peut donc jouer contre lui
EquipeAdversaire[EquipeCourante].push_back(AdversairePotentiel);
EquipeAdversaire[AdversairePotentiel].push_back(EquipeCourante);
}
}
}
// -- Code pour tester débute ici --
Memo1->Lines->Clear();
int Count = 0;
Memo1->Lines->BeginUpdate();
for(std::map< int, std::vector<int> >::iterator EquipeIt=EquipeAdversaire.begin(); EquipeIt!=EquipeAdversaire.end(); ++EquipeIt)
{
for(std::vector<int>::iterator AdversaireIt=EquipeIt->second.begin(); AdversaireIt!=EquipeIt->second.end(); ++AdversaireIt)
{
AnsiString temp = String(++Count) + ": E_";
temp += EquipeIt->first;
temp += "_vs_E_";
temp += *AdversaireIt;
Memo1->Lines->Add(temp);
}
Memo1->Lines->Add("--------------") ;
}
Memo1->Lines->EndUpdate();
if(Count < (nbEquipes * 5))
{
MessageDlg(String("Il faut générer encore, il manque des parties à jouer! Il faudrait peut-être appellé la méthode de façon récursive."), mtInformation, TMsgDlgButtons() << mbOK, 0);
}
// -- Code pour tester fini ici -- |
Partager