Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <time.h>
- #include <string>
- #include <cstdlib>
- using namespace std;
- bool check(int csapatindex,int *jatszik,const int no_of_teams){
- bool jatek=0;
- for(int i=0;i<no_of_teams;i++){
- if(csapatindex == *(jatszik+i)){
- jatek=1;
- }
- }
- return jatek;
- }
- bool sorsol(bool *kereszt[],int *jatszik,char *argv[],int *lehetseges,int meccs,bool tavaszi,const int no_of_teams){
- int csapat1index,csapat2index,i,j=0,lehet_index;
- bool hazai; int osszeg=0;
- do{
- csapat1index=(rand()%no_of_teams)+1; //sorsolunk egy csapatot
- }while(check(csapat1index,jatszik,no_of_teams)); //megnézzük, hogy játszik-e az adott csapat
- hazai=rand()%2; //eldöntjük, hogy Csapat 1 hazai pályán játsszon-e
- switch(tavaszi){ //őszi-tavaszi szezontól függően változik a csapatválasztás kritériuma
- case 0:{
- 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
- if((*(kereszt[csapat1index-1]+i)==1)&&(*(kereszt[i]+(csapat1index-1))==1)&&!(check(i+1,jatszik,no_of_teams))){
- *(lehetseges+j)=i+1; //ha megfelel a kritériumoknak, lehetséges ellenfél
- j++;
- }
- }break;
- }
- case 1:{
- 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
- if(((*(kereszt[csapat1index-1]+i)==1)&&(*(kereszt[i]+(csapat1index-1))==0)||(*(kereszt[csapat1index-1]+i)==0)&&
- (*(kereszt[i]+(csapat1index-1))==1))&&!(check(i+1,jatszik,no_of_teams))){
- *(lehetseges+j)=i+1;
- j++;
- }
- }break;
- }
- }
- for(i=0;i<no_of_teams;i++){
- osszeg+=*(lehetseges+i); //ha nincs lehetséges ellenfél, az összeg 0 lesz
- }
- if(osszeg==0) return 1; //ekkor újrasorsoljuk a fordulót
- do{
- lehet_index=rand()%j;
- csapat2index=*(lehetseges+lehet_index); //a lehetséges csapatok közül választunk egyet
- }while(check(csapat2index,jatszik,no_of_teams));
- if(tavaszi){ //tavasszal visszavágókat játszanak, negáljuk a hazai 'státuszt'
- if(hazai && (*(kereszt[csapat1index-1]+(csapat2index-1))==0)) hazai=0;
- else if(!hazai && (*(kereszt[csapat2index-1]+(csapat1index-1))==0)) hazai=1;
- }
- if(hazai){
- *(jatszik+meccs)=csapat1index;
- *(jatszik+meccs+1)=csapat2index;
- } //a csapatok sorrendje buffernél, és ezzel a kiíratásnál számít
- else{
- *(jatszik+meccs)=csapat2index;
- *(jatszik+meccs+1)=csapat1index;
- }
- for(i=0;i<no_of_teams;i++)
- *(lehetseges+i)=0;
- return 0;
- }
- void init(bool *kereszt[],const int no_of_teams){
- int i,j;
- for(i=0;i<no_of_teams;i++)
- kereszt[i]=new bool [no_of_teams];
- for(i=0;i<no_of_teams;i++)
- for(j=0;j<no_of_teams;j++)
- *(kereszt[i]+j)=1;
- for(i=0,j=0;i<no_of_teams;i++,j++)
- *(kereszt[i]+j)=0;
- }
- void init2(int *jatszik,int *lehetseges,const int no_of_teams){
- for(int i=0;i<no_of_teams;i++){
- *(jatszik+i)=0;
- *(lehetseges+i)=0;
- }
- }
- void edit_kereszt(bool *kereszt[],int *jatszik,const int no_of_teams){
- for(int i=1;i<=no_of_teams;){
- *(kereszt[*(jatszik+i-1)-1]+(*(jatszik+i)-1))=0;
- i+=2;
- }
- }
- void bufferel(int *buffer,int *jatszik,int start,int max){
- for(int i=0;start<max;start++,i++){
- *(buffer+start)=*(jatszik+i);
- }
- }
- void kiirat(int *buffer,char *argv[],const int no_of_rounds,const int no_of_teams){
- int j=0;
- int i;
- for(i=1;i<=no_of_rounds;i++){
- cout << i << ". forduló\n";
- for(;j<i*no_of_teams;){
- cout << argv[*(buffer+j)] << " - " << argv[*(buffer+j+1)] << endl;
- j+=2;
- }
- cout << endl;
- }
- }
- int main(int argc,char *argv[]){
- srand(time(NULL));
- const int no_of_teams=argc-1;
- const int no_of_rounds=(no_of_teams-1)*2;
- megszakit:
- int i,j,k,meccs=0;
- int *lehetseges=new int [no_of_teams]; //egy csapat lehetséges ellenfelei
- int *jatszik=new int [no_of_teams]; //itt tároljuk azokat a csapatokat, melyek már játszanak az adott fordulóban
- int *buffer=new int[no_of_teams*no_of_rounds];
- bool *kereszt[no_of_teams];
- bool tavaszi=0;
- init(kereszt,no_of_teams); //kereszttáblázat inicializálása
- init2(jatszik,lehetseges,no_of_teams);
- int counter=0;
- for(i=1;i<=no_of_rounds;i++){
- counter=0;
- if(i>no_of_rounds/2) tavaszi=1; //a 16. fordulótól tavaszi szezon
- for(j=0;j<no_of_teams/2;){
- if(sorsol(kereszt,jatszik,argv,lehetseges,meccs,tavaszi,no_of_teams)){
- init2(jatszik,lehetseges,no_of_teams);
- j=0; meccs=0;
- counter++;
- if(counter==1000){ //tetszőleges küszöb, ha 1000x nem talált lehetséges ellenfelet a prog., akkor valószínűleg
- delete[] buffer; //úgy jött ki a sorsolás, hogy nincs is
- delete[] lehetseges;
- delete[] jatszik;
- for(i=0;i<no_of_teams;i++){
- delete[] kereszt[i];
- }
- goto megszakit;
- }
- continue;
- }
- j++;
- meccs+=2;
- }
- 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
- bufferel(buffer,jatszik,(i-1)*no_of_teams,i*no_of_teams);
- for(k=0;k<no_of_teams;k++){
- *(jatszik+k)=0;
- }
- meccs=0;
- }
- kiirat(buffer,argv,no_of_rounds,no_of_teams);
- //Kereszttáblázat mátrix:
- for(i=0;i<no_of_teams;i++){
- for(j=0;j<no_of_teams;j++){
- cout << *(kereszt[i]+j) << " ";
- }
- cout << endl;
- }
- for(i=0;i<no_of_teams;i++){
- delete[] kereszt[i];
- }
- delete[] buffer;
- delete[] lehetseges;
- delete[] jatszik;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement