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){
- bool jatek=0;
- for(int i=0;i<16;i++){
- if(csapatindex == *(jatszik+i)){
- jatek=1;
- }
- }
- return jatek;
- }
- bool sorsol(bool kereszt[16][16],int *jatszik,char *argv[],int *lehetseges,int meccs,bool tavaszi){
- int csapat1index,csapat2index,i,j=0,lehet_index;
- bool hazai; int osszeg=0;
- do{
- csapat1index=(rand()%16)+1; //sorsolunk egy csapatot
- }while(check(csapat1index,jatszik)); //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<16;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))){
- *(lehetseges+j)=i+1; //ha megfelel a kritériumoknak, lehetséges ellenfél
- j++;
- }
- }break;
- }
- case 1:{
- for(i=0;i<16;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))){
- *(lehetseges+j)=i+1;
- j++;
- }
- }break;
- }
- }
- for(i=0;i<16;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));
- 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<16;i++)
- *(lehetseges+i)=0;
- return 0;
- }
- void init(bool kereszt[16][16]){
- int i,j;
- for(i=0;i<16;i++)
- for(j=0;j<16;j++)
- kereszt[i][j]=1;
- for(i=0,j=0;i<16;i++,j++)
- kereszt[i][j]=0;
- }
- void init2(int *jatszik,int *lehetseges){
- for(int i=0;i<16;i++){
- *(jatszik+i)=0;
- *(lehetseges+i)=0;
- }
- }
- void edit_kereszt(bool kereszt[16][16],int *jatszik){
- for(int i=1;i<=16;){
- 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[]){
- int j=0;
- int i;
- for(i=1;i<=30;i++){
- cout << i << ". forduló\n";
- for(;j<i*16;){
- cout << argv[*(buffer+j)] << " - " << argv[*(buffer+j+1)] << endl;
- j+=2;
- }
- cout << endl;
- }
- }
- int main(int argc,char *argv[]){
- srand(time(NULL));
- megszakit:
- int i,j,k,meccs=0;
- int *lehetseges=new int [16]; //egy csapat lehetséges ellenfelei
- int *jatszik=new int [16]; //itt tároljuk azokat a csapatokat, melyek már játszanak az adott fordulóban
- int *buffer=new int[480];
- bool kereszt[16][16],tavaszi=0;
- init(kereszt); //kereszttáblázat inicializálása
- init2(jatszik,lehetseges);
- int counter=0;
- for(i=1;i<=30;i++){
- counter=0;
- if(i>15) tavaszi=1; //a 16. fordulótól tavaszi szezon
- for(j=0;j<8;){
- if(sorsol(kereszt,jatszik,argv,lehetseges,meccs,tavaszi)){
- init2(jatszik,lehetseges);
- 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;
- goto megszakit;
- }
- continue;
- }
- j++;
- meccs+=2;
- }
- edit_kereszt(kereszt,jatszik); //a kereszttáblázatba beírjuk a 0-kat, azaz, hogy kivel nem játszhat már egy csapat
- bufferel(buffer,jatszik,(i-1)*16,i*16);
- for(k=0;k<16;k++){
- *(jatszik+k)=0;
- }
- meccs=0;
- }
- kiirat(buffer,argv);
- /*Kereszttáblázat mátrix:
- for(i=0;i<16;i++){
- for(j=0;j<16;j++){
- cout << kereszt[i][j] << " ";
- }
- cout << endl;
- }*/
- delete[] buffer;
- delete[] lehetseges;
- delete[] jatszik;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement