001
22.05.2006, 19:03 Uhr
~gast
Gast
|
C++: |
#include <iostream.h> #include <conio.h>
#define MAX 50
int tuerme[MAX][3]; //Feld für 3 Stäbe mit Max. Ringen
void turm(int n) //Baut den Turm auf den ersten Stab und leert den 2. und 3. Stab { for(int i=0;i<MAX;i++) //1.bis 50. Ebene { tuerme[i][0]=n; //Stab 1: Ringgröße eintragen tuerme[i][1]=0; //Stab 2: leer tuerme[i][2]=0; //Stab 3: leer n--; //Ringgröße -1 if (n<0) n=0; //wenn Ring <0 dann Ring=0 } }
void zeige() //Anzeigen der Türme { int hoehe=0; for(int z=0; z<MAX; z++) //suche maximale Turmhöhe (anfangen mit Ebene 0) { if(( tuerme[z][0]) || (tuerme[z][1]) || (tuerme[z][2]) !=0) hoehe++; //wenn Ebene von Stab 1 oder Stab 2 oder Stab 3 mit Ring gefüllt } //dann hoehe +1 for(;hoehe>=0;hoehe--) //von oberste Ebene bis zur nullten { for(int t=0;t<3;t++) //Stab 1 bis 3 { if(tuerme[hoehe][t]>0) cout<<tuerme[hoehe][t]<<"\t"; else cout<<"\t"; //wenn Ebene von stab t vorhanden dann Ringgröße ausgeben } //sonst tabulator cout<<endl; //nächster zeilenanfang } cout<<"*\t*\t*"<<endl; //Fuß ausgeben getch(); //warte auf Tastendruck }
int suche(int stab) //suche unterste leerebene vom stab { for(int i=0;i<MAX;i++) //von nullebene bis max { if(tuerme[i][stab]==0) return i; //wenn ebene leer dann rückgabe der ebene } return i; //max-ebene zurückgegen }
void ebene(int nach,int von) //ring von nach wechseln { int v,n; v=suche(von)-1; //obersten ring suchen n=suche(nach); //oberste leerebene suchen tuerme[n][nach]=tuerme[v][von]; //ringgröße übergeben tuerme[v][von]=0; //alte pos löschen zeige(); //anzeigen der Türme }
void hanoi(int von,int nach,int rest,int n) //Turm von nach mit hilfe von rest //mit bis zu einer Ringgröße von n wechseln { if(n==2) //wenn ringröße=2 { ebene(rest,von); //DANN obersten ring "von" nach "rest" wechseln ebene(nach,von); // obersten ring "von" nach "nach" wechseln ebene(nach,rest); // obersten ring "rest" nach "nach" wechseln } else //SONST { hanoi(von,rest,nach,n-1); //TURM von "von" nach "rest" mit hilfe von "nach" //mit bis zu einer Ringgröße von n-1 wechseln ebene(nach,von); //obersten ring von "von" nach "nach" wechseln hanoi(rest,nach,von,n-1); //TURM von "rest" nach "nach" mit hilfe von "von" //mit bis zu einer Ringgröße von n-1 wechseln } return; }
void main(void) { int n; cout<<"Der Turm von Hanoi\n\nWie hoch soll der Turm sein ?"; cin>>n; if(n>=MAX) { cout<<"Ich hab max. "<<MAX<<" Ebenen vorgesehen"<<endl; n=MAX; } turm(n); //Turm aufbauen zeige(); //Türme anzeigen hanoi(0,2,1,n); //Turm wechsle dich }
|
|