Advertisement
Guest User

Bajnokság-generátor v2

a guest
Apr 19th, 2013
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <time.h>
  3. #include <string>
  4. #include <cstdlib>
  5. using namespace std;
  6.  
  7. bool check(int csapatindex,int *jatszik,const int no_of_teams){
  8.     bool jatek=0;
  9.     for(int i=0;i<no_of_teams;i++){
  10.         if(csapatindex == *(jatszik+i)){
  11.             jatek=1;
  12.         }
  13.     }
  14.    
  15.     return jatek;
  16. }
  17.  
  18. bool sorsol(bool *kereszt[],int *jatszik,char *argv[],int *lehetseges,int meccs,bool tavaszi,const int no_of_teams){
  19.     int csapat1index,csapat2index,i,j=0,lehet_index;
  20.     bool hazai; int osszeg=0;
  21.     do{
  22.         csapat1index=(rand()%no_of_teams)+1;            //sorsolunk egy csapatot
  23.     }while(check(csapat1index,jatszik,no_of_teams));    //megnézzük, hogy játszik-e az adott csapat
  24.  
  25.     hazai=rand()%2;     //eldöntjük, hogy Csapat 1 hazai pályán játsszon-e
  26.  
  27.     switch(tavaszi){        //őszi-tavaszi szezontól függően változik a csapatválasztás kritériuma
  28.         case 0:{
  29.             for(i=0;i<no_of_teams;i++){ //megvizsgáljuk az összes csapatot, ősszel a kereszttáblában hazai + idegenbeli meccsnél is 1-1-nek kell lenni
  30.                 if((*(kereszt[csapat1index-1]+i)==1)&&(*(kereszt[i]+(csapat1index-1))==1)&&!(check(i+1,jatszik,no_of_teams))){
  31.                     *(lehetseges+j)=i+1; //ha megfelel a kritériumoknak, lehetséges ellenfél
  32.                     j++;
  33.                 }
  34.             }break;
  35.         }
  36.         case 1:{
  37.             for(i=0;i<no_of_teams;i++){                     //ősszel már játszott valahogy a két csapat, így kereszt: 1-0 v. 0-1
  38.                 if(((*(kereszt[csapat1index-1]+i)==1)&&(*(kereszt[i]+(csapat1index-1))==0)||(*(kereszt[csapat1index-1]+i)==0)&&
  39.                     (*(kereszt[i]+(csapat1index-1))==1))&&!(check(i+1,jatszik,no_of_teams))){
  40.                     *(lehetseges+j)=i+1;
  41.                         j++;
  42.                 }
  43.             }break;
  44.         }
  45.     }
  46.  
  47.  
  48.     for(i=0;i<no_of_teams;i++){
  49.         osszeg+=*(lehetseges+i); //ha nincs lehetséges ellenfél, az összeg 0 lesz
  50.     }
  51.     if(osszeg==0) return 1; //ekkor újrasorsoljuk a fordulót
  52.    
  53.  
  54.     do{
  55.         lehet_index=rand()%j;
  56.         csapat2index=*(lehetseges+lehet_index); //a lehetséges csapatok közül választunk egyet
  57.     }while(check(csapat2index,jatszik,no_of_teams));
  58.  
  59.     if(tavaszi){    //tavasszal visszavágókat játszanak, negáljuk a hazai 'státuszt'
  60.         if(hazai && (*(kereszt[csapat1index-1]+(csapat2index-1))==0)) hazai=0;
  61.         else if(!hazai && (*(kereszt[csapat2index-1]+(csapat1index-1))==0)) hazai=1;
  62.     }
  63.  
  64.     if(hazai){
  65.         *(jatszik+meccs)=csapat1index;
  66.         *(jatszik+meccs+1)=csapat2index;
  67.     }                                       //a csapatok sorrendje buffernél, és ezzel a kiíratásnál számít
  68.     else{
  69.         *(jatszik+meccs)=csapat2index;
  70.         *(jatszik+meccs+1)=csapat1index;
  71.     }
  72.  
  73.  
  74.     for(i=0;i<no_of_teams;i++)
  75.         *(lehetseges+i)=0;
  76.  
  77.     return 0;
  78. }
  79.  
  80.  
  81. void init(bool *kereszt[],const int no_of_teams){
  82.     int i,j;
  83.     for(i=0;i<no_of_teams;i++)
  84.             kereszt[i]=new bool [no_of_teams];
  85.  
  86.     for(i=0;i<no_of_teams;i++)
  87.         for(j=0;j<no_of_teams;j++)
  88.             *(kereszt[i]+j)=1;
  89.  
  90.     for(i=0,j=0;i<no_of_teams;i++,j++)
  91.         *(kereszt[i]+j)=0;
  92.  
  93. }
  94.  
  95. void init2(int *jatszik,int *lehetseges,const int no_of_teams){
  96.     for(int i=0;i<no_of_teams;i++){
  97.         *(jatszik+i)=0;
  98.         *(lehetseges+i)=0;
  99.     }
  100.    
  101. }
  102.  
  103. void edit_kereszt(bool *kereszt[],int *jatszik,const int no_of_teams){
  104.     for(int i=1;i<=no_of_teams;){
  105.         *(kereszt[*(jatszik+i-1)-1]+(*(jatszik+i)-1))=0;
  106.         i+=2;
  107.     }
  108.  
  109. }
  110.  
  111. void bufferel(int *buffer,int *jatszik,int start,int max){
  112.     for(int i=0;start<max;start++,i++){
  113.         *(buffer+start)=*(jatszik+i);
  114.     }
  115. }
  116.  
  117. void kiirat(int *buffer,char *argv[],const int no_of_rounds,const int no_of_teams){
  118.     int j=0;
  119.     int i;
  120.     for(i=1;i<=no_of_rounds;i++){
  121.         cout << i << ". forduló\n";
  122.         for(;j<i*no_of_teams;){
  123.             cout << argv[*(buffer+j)] << " - " << argv[*(buffer+j+1)] << endl;
  124.             j+=2;
  125.         }
  126.         cout << endl;
  127.     }
  128. }
  129.  
  130. int main(int argc,char *argv[]){
  131.     srand(time(NULL));
  132.     const int no_of_teams=argc-1;
  133.     const int no_of_rounds=(no_of_teams-1)*2;
  134.  
  135.     megszakit:
  136.     int i,j,k,meccs=0;
  137.     int *lehetseges=new int [no_of_teams];  //egy csapat lehetséges ellenfelei
  138.     int *jatszik=new int [no_of_teams];     //itt tároljuk azokat a csapatokat, melyek már játszanak az adott fordulóban
  139.     int *buffer=new int[no_of_teams*no_of_rounds];
  140.     bool *kereszt[no_of_teams];
  141.     bool tavaszi=0;
  142.  
  143.     init(kereszt,no_of_teams); //kereszttáblázat inicializálása
  144.  
  145.     init2(jatszik,lehetseges,no_of_teams);
  146.  
  147.     int counter=0;
  148.  
  149.     for(i=1;i<=no_of_rounds;i++){
  150.    
  151.         counter=0;
  152.         if(i>no_of_rounds/2) tavaszi=1; //a 16. fordulótól tavaszi szezon
  153.  
  154.         for(j=0;j<no_of_teams/2;){
  155.            
  156.             if(sorsol(kereszt,jatszik,argv,lehetseges,meccs,tavaszi,no_of_teams)){
  157.                 init2(jatszik,lehetseges,no_of_teams);
  158.                 j=0; meccs=0;
  159.                 counter++;
  160.                 if(counter==1000){              //tetszőleges küszöb, ha 1000x nem talált lehetséges ellenfelet a prog., akkor valószínűleg
  161.                     delete[] buffer;            //úgy jött ki a sorsolás, hogy nincs is
  162.                     delete[] lehetseges;
  163.                     delete[] jatszik;
  164.                     for(i=0;i<no_of_teams;i++){
  165.                         delete[] kereszt[i];
  166.                     }
  167.                     goto megszakit;
  168.                 }
  169.  
  170.                 continue;
  171.             }
  172.  
  173.             j++;
  174.  
  175.             meccs+=2;
  176.  
  177.         }
  178.  
  179.         edit_kereszt(kereszt,jatszik,no_of_teams);              //a kereszttáblázatba beírjuk a 0-kat, azaz, hogy kivel nem játszhat már egy csapat
  180.         bufferel(buffer,jatszik,(i-1)*no_of_teams,i*no_of_teams);      
  181.  
  182.         for(k=0;k<no_of_teams;k++){
  183.             *(jatszik+k)=0;
  184.         }
  185.  
  186.         meccs=0;
  187.  
  188.     }
  189.  
  190.     kiirat(buffer,argv,no_of_rounds,no_of_teams);
  191.  
  192.     //Kereszttáblázat mátrix:
  193.     for(i=0;i<no_of_teams;i++){
  194.         for(j=0;j<no_of_teams;j++){
  195.             cout << *(kereszt[i]+j) << " ";
  196.         }
  197.         cout << endl;
  198.     }
  199.    
  200.     for(i=0;i<no_of_teams;i++){
  201.         delete[] kereszt[i];
  202.     }
  203.  
  204.     delete[] buffer;
  205.     delete[] lehetseges;
  206.     delete[] jatszik;
  207.     return 0;
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement