[C] Kleine Probleme bei Towers of Hanoi

Dieses Thema im Forum "C/C++" wurde erstellt von brahma, 10.12.2006.

  1. brahma

    brahma Netzpirat

    Dabei seit:
    06.12.2005
    Beiträge:
    709
    Zustimmungen:
    0
    Ort:
    Münsterland
    Moin.

    Ich muss ein Programm schreiben, das rekursiv die Schritte für das Spiel Towers of Hanoi berechnet. Das war soweit kein Problem, allerdings soll auch immer ausgegeben werden, wo sich weche scheibe befindet, in der Form, das jeder Stab ein Array symbolisiert.

    Das Startarray initialisiere ich mit folgender Funktion:
    Code:
    void initTower(int n, int *src, int *tmp, int *dst){
    	int i=0;
    	while(i<n){
    		src[n-i-1]=n-i;
    		i++;
    	}
    	schuffleTower(n, src, tmp, dst);
    }
    Je nachdem wieviele SCheiben vorkommen sollen (n) wird src eben gefüllt.

    SchuffleTower ist dann mein Algorythmus, der die Schritte brechnet.

    Code:
    void schuffleTower(int n, int *src, int *tmp, int *dst){
    	if(n > 0){
    		schuffleTower(n-1, src, dst, tmp);
    		showTowers(src, tmp, dst);
    		schuffleTower(n-1, tmp, src, dst);
    	}
    }
    Er funktioniert auch, verschiebt mir aber leider immer den ganzen Tower auf den Scheiben, und nicht nur ein Element. WIe kann ich das ändern, das ähnlich wie in vielen Anwendungen im Web die Scheiben einzeln ausgegeben werden?

    Zur Ausgabe habe ich Momentan folgende Funktion:

    Code:
    void showTowers(int *src, int *tmp, int *dst){
    	int i=0;
    	printf("A:");
    	while(src[i] > 0){
    		printf("%i ", src[i]);
    		i++;
    	}
    	i=0;
    	printf("\nB:");
    	while(tmp[i] > 0) {
    		printf("%i ", tmp[i]);
    		i++;
    	}
    	i=0;
    	printf("\nC:");
    	while(dst[i] > 0){
    		printf("%i ", dst[i]);	
    		i++;
    	}
    	printf("\n\n");
    }
    Diese gibt mir dann jeweils das Bild aus

    A: 4321
    B:
    C:

    für den Start. Jetzt müsste nach Schritt 1 kommen:

    A: 432
    B:
    C: 1

    Normalerweise würde ich fummeln bis das klappt, aber ich hab da etwas Zeitdruck ;)
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. brahma

    brahma Netzpirat

    Dabei seit:
    06.12.2005
    Beiträge:
    709
    Zustimmungen:
    0
    Ort:
    Münsterland
    Ok, mittlerweile konnte ich es soweit eingrenzen, das ich suche, wie ich einen Wert aus einem Feld rekursiv einem anderen zuweisen kann....

    Jemand da eine idee?
     
  4. #3 supersucker, 11.12.2006
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Hmm,

    ist nicht böse gemeint, aber kann es sein dass dir allgemein nicht so klar wie ein Rekursion läuft?

    Du solltest da schon ein spezifisches Code-Beispiel geben wo dir das nicht so klar ist.

    Rekursion ist z.b. sowas:

    Code:
    private static int beerCount = 0;
    private static final int limit = 10;
    
    public String getDrunk() {
    
       beerCount++;
       if(beerCount > limit)
          return "knockout";
       getDrunk();
    }
    
     
  5. brahma

    brahma Netzpirat

    Dabei seit:
    06.12.2005
    Beiträge:
    709
    Zustimmungen:
    0
    Ort:
    Münsterland
    Doch, ich weiss wie Rekursion läuft, hab ja eine eingebaut :D

    Leider verschiebt meine Rekursion immer das ganze src-Feld auf den Stangen, ich mich müsste das mit einzelnen Elementen haben, ich komm nur nicht auf den richtigen Weg. Das ich mein Problem.

    Ich seh einfach nicht wie ich die Funktion umbauen müsste, oder ob es so überhaupt machbar ist.
     
  6. musiKk

    musiKk Dr. Strangelove

    Dabei seit:
    30.07.2006
    Beiträge:
    264
    Zustimmungen:
    0
    Ort:
    Leipzig
    Probiers mal mit folgendem: Ersetze deine showTowers-Funktion durch
    Code:
    printf("%d -> %d  ",  src , dst);
    Kann allerdings nicht sagen, ob das die richtigen Parameter sind. Das Hanoi-Programm, was unser Prof mal vorgelegt hat, hat die Parameter in der bei dir schuffleTower genannten Funktion in einer anderen Reihenfolge angegeben. Duerfte natuerlich irrelevant sein.

    Den Einwand von supersucker verstehe ich allerdings auch nicht.
     
  7. brahma

    brahma Netzpirat

    Dabei seit:
    06.12.2005
    Beiträge:
    709
    Zustimmungen:
    0
    Ort:
    Münsterland
    So, ich hatte gerade Praktikum und per Trial & Error haben wirs dann hinbekommen:

    Code:
    void getMoves(int *src, int *tmp, int *dst){
    	int X, Y;
    	for(X=0; src[X] > 0;X++);
    	for(Y=0; dst[Y] > 0;Y++);
    	dst[Y]=src[X-1];
    	src[X-1]=0;
    	schritt++;
    	showTower();
    }
    Es ging ja nur darum die Arrays zu verändern, und jetzt wo ichs hab wars ganz easy, aber am Wo-Ende kam ich da absulut nicht drauf ;)

    Danke schonmal alle fürs lesen :D
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

[C] Kleine Probleme bei Towers of Hanoi

Die Seite wird geladen...

[C] Kleine Probleme bei Towers of Hanoi - Ähnliche Themen

  1. [Fluxbox] Zwei kleine Probleme

    [Fluxbox] Zwei kleine Probleme: Hallo, nutze seit kurzen wieder Fluxbox für Ubuntu und bin soweit eigentlich ziemlich zufrieden. wBar läuft, conky hab ich auch nen schön...
  2. 2 eher kleine Probleme

    2 eher kleine Probleme: 1. Ein Problem mit Compiz-Fusion: Wenn KDE angeht startet CompizFusion mit annel effekten aber dann stellt es sich gleich wieder auf KDE um aber...
  3. 3 kleine probleme

    3 kleine probleme: Also ich habe drei probleme:( problem 1: ich will die auflösung umstellen aber wenn ich sie höher als 1024x768 eistelle gehn die herzzahl...
  4. Kleinere Probleme mit Firefox

    Kleinere Probleme mit Firefox: Moin . Kennst sich jemand zufällig soweit mit dem Firefox aus dass er mir sagen kann warum meiner Firefox nicht kapiert dass er deutsch kann ?...
  5. ein paar kleine probleme bei slackware 10

    ein paar kleine probleme bei slackware 10: hi, ich habe gestern slackware 10 auf meinem alten pc aufgespielt. im großen und ganzen wars ja nicht sonderlich kompliziert, aber ein paar...