[C] Kleine Probleme bei Towers of Hanoi

brahma

brahma

Netzpirat
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 ;)
 
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?
 
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();
}
 
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);
	}
}

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.
 
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.
 
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
 

Ähnliche Themen

"non blocking console input" wieder rückgängig machen?

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

Aufgabe in C

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Zurück
Oben