Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Labyrinth

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
01.09.2003, 13:26 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


zu schreiben ist foldende funktion

C++:
void createLab(int xstart, int ystart, int xdim, int ydim, int** &lab);



Diese Funktion soll ein labyrinth nach folgendem algo erstellen

aufgerufen wird das lab so

C++:
createLab(0,0,xdim,ydim,labyrinth);


xdim und ydim müssen mindestens 3 sein und ungerade, falls eine gerade zahl übergeben wird, wird diese um 1 erhöht

es wir überprüft ob das labyrinth schon existiert. wenn nicht wird der erfoderliche speicher dafür allokiert und es werden ersteinmal alle werte mit einer 1(Wege) initialisiert.
Nun werden als erstes um das Labyrinth herum Mauern gezogen. Mauern sind die 0. Es sollen ints (und nicht bool) für das lab benutzt werden auch wenn im Moment nur 0 und 1 verwendet werden. (Wird fürs folgerätsel gebraucht)

sind die Mauern gezogen, wird oben (also in der Nordmauer) ein zufäliger eingang gesetzt und in der Südmauer ein zufälliger ausgang.

Hierbei ist zu beachten das eingang ausgang und wege am ende nur auf ungeraden stellen liegen können. Auf den Geraden liegen die Mauern.

das kleinst mögliche Lab sieht dann so aus
#.#
#.#
#.#


habt ihr nur das labyrinth initialisiert soll sich die funktion rekursiv selber aufrufen. Bei jedem aufruf wird eine neue Mauer gezogen, wobei zufällig sein soll ob es ein horizontale oder vertikale mauer wird. Ist die Mauer gezogen wird noch genau ein zufälliger Weg in die Mauer gestetzt

dann ruft sich die funktion wieder selber auf so lange bis keine mauern mehr gezogen werden können


C++:
int main(){

int i,j,**labyrinth;
int xdim=15;
int ydim=11;
createLab(0,0,xdim,ydim,labyrinth);

printf("\n");
for(j=0;j<ydim;j++){
    for(i=0;i<xdim;i++){
        if(labyrinth[i][j]==0)printf("#");else printf(".");
    }
    printf("\n");
}
printf("\n\n");

for(i=0;i<xdim;i++) delete [] labyrinth[i];
delete [] labyrinth;

}




Viel Spass
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 01.09.2003 um 13:29 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.09.2003, 00:27 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


da ja anscheinend überhaupt keiner Bock auf das Rätsel hat werd ichs mal auflösen. Vielleicht gefällt euch ja das Folgerätsel dazu besser. Habs gerade fertig gemacht.

C++:
void createLab(int xstart, int ystart, int xdim, int ydim, int** &lab){
int i,j,k,help;

    if(!xstart){
        
        if(!(xdim%2))xdim++;
        if(!(ydim%2))ydim++;
        
        lab=new int*[xdim];
        for(i=0;i<xdim;i++)
            lab[i] = new int[ydim];
            
        for(j=0;j<ydim;j++)
            for(i=0;i<xdim;i++)
                lab[i][j]=1;
        
        
        //Aussenmauern (Nullen) setzen
        for (i=0;i<ydim;i++){lab[0][i]=0;lab[xdim-1][i]=0;}
        for (i=0;i<xdim;i++){lab[i][0]=0;lab[i][ydim-1]=0;}

            //Eingang ermitteln
        i=rand()%(xdim-1);
        if(!(i%2))i++;
        lab[i][0]=1;

        //Ausgang ermitteln
        i=rand()%(xdim-1);
        if(!(i%2))i++;
        lab[i][ydim-1]=1;

        if(xdim>3 || ydim>3) createLab(1, 1, xdim-2, ydim-2, lab);

    }else{

            //"zufällige" Berechnung ob vertikale oder horizontale Mauer gezogen wird.
        j=0;k=0;
        for(i=0;i<(xdim-xstart);i++)j+=rand()%2;
        for(i=0;i<(ydim-ystart);i++)k+=rand()%2;


        if(j>k){                    // Vertikale Mauer ziehen
            do{help=rand()%xdim;if(help%2)help++;}while(help<xstart);
            for(i=ystart;i<ydim+1;i++)lab[help][i]=0;
            i=help;
            //Durchgang setzen
            do{help=rand()%ydim;if(!(help%2)){help++;}}while(help<ystart);    
            lab[i][help]=1;
            k=0;        
        }
        else{                        //Horizontale Mauer ziehen
            do{help=rand()%ydim;if(help%2){help++;}}while(help<ystart);
            for(i=xstart;i<xdim+1;i++) lab[i][help]=0;
            i=help;
            //Durchgang setzen
            do{help=rand()%xdim;if(!(help%2)){help++;}}while(help<xstart);    
            lab[help][i]=1;
            k=1;
        }

        
        //rekuriver Aufruf der Sublabs
        if(k){            //Wenn horizontale Mauer gezogen
            if((i-ystart)>2) createLab(xstart,ystart,xdim,i-1,lab);
            if((ydim-i)>2)createLab(xstart,i+1,xdim,ydim,lab);

        }
        else{            //Wenn vertikale Mauer gezogen
            if((i-xstart)>2)createLab(xstart,ystart,i-1,ydim,lab);
            if((xdim-i)>2)createLab(i+1,ystart,xdim,ydim,lab);
        }
    
    }//End else

}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: