[C] Kleine Probleme bei Towers of Hanoi

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
brahma
Beiträge: 653
Registriert: 28.08.2003 11:05:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Münsterland

[C] Kleine Probleme bei Towers of Hanoi

Beitrag von brahma » 10.12.2006 17:42:46

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: Alles auswählen

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: Alles auswählen

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: Alles auswählen

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 ;)
/* NO COMMENT */

ulf
Beiträge: 39
Registriert: 22.09.2002 13:00:52

Re: [C] Kleine Probleme bei Towers of Hanoi

Beitrag von ulf » 10.12.2006 20:53:12

brahma hat geschrieben: Er funktioniert auch, verschiebt mir aber leider immer den ganzen Tower auf den Scheiben, und nicht nur ein Element.
Nein, er verschiebt kein Element.
für den Start. Jetzt müsste nach Schritt 1 kommen:
Und was kommt statt dessen?

Gruß,
Ulf

Benutzeravatar
brahma
Beiträge: 653
Registriert: 28.08.2003 11:05:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Münsterland

Beitrag von brahma » 10.12.2006 22:12:24

Najo, ein verschobener Turm :D
A: 4321
B:
C:

A:
B: 4321
C:

A:
B:
C: 4321

Vlt. nicht in der Reihenfolge, aber das kommt dabei raus....
/* NO COMMENT */

ulf
Beiträge: 39
Registriert: 22.09.2002 13:00:52

Beitrag von ulf » 11.12.2006 13:00:30

brahma hat geschrieben:Najo, ein verschobener Turm :D
Wo ist die Stelle, an der Du tatsächlich eine Scheibe von einem Array zum anderen verschiebst?
Schau Dir den Algorithmus nochmal an!

Und wieso soll bei der Ausgabefunktion die Zuordnung
src <--> A etc.
stimmen, wenn sie jedesmal mit anderen Parametern aufgerufen wird?

Gruß,
Ulf

Benutzeravatar
bse
Beiträge: 468
Registriert: 19.03.2006 19:58:00
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von bse » 12.12.2006 02:10:17

ulf hat geschrieben: Wo ist die Stelle, an der Du tatsächlich eine Scheibe von einem Array zum anderen verschiebst?
Schau Dir den Algorithmus nochmal an!
Bis auf die Betonung muss ich zustimmen: Wo ist die Stelle, an der Du tatsächlich eine Scheibe von einem Array zum anderen verschiebst?

Zum Aufruf mit anderen Parametern: Das ist im "Orginal" von dem dieses Programm hier vermutlich "inspiriert" wurde auch so, und entspricht einfach einem Umsortieren ganzer Türme. Nicht intuitiv, aber korrekt. Wenn man weiß, was man tut.

Vgl. http://www.kernelthread.com/hanoi/html/c.html

ulf
Beiträge: 39
Registriert: 22.09.2002 13:00:52

Beitrag von ulf » 12.12.2006 21:18:34

bse hat geschrieben:
Bis auf die Betonung muss ich zustimmen: Wo ist die Stelle, an der Du tatsächlich eine Scheibe von einem Array zum anderen verschiebst?
Du meintest sicher: "eine Scheibe". :wink:
Zum Aufruf mit anderen Parametern: Das ist im "Orginal" von dem dieses Programm hier vermutlich "inspiriert" wurde auch so, und entspricht einfach einem Umsortieren ganzer Türme. Nicht intuitiv, aber korrekt. Wenn man weiß, was man tut.
Nein, er schreibt ja

Code: Alles auswählen

printf("A:");
und nicht

Code: Alles auswählen

printf("src:");
Gruß,
Ulf

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 12.12.2006 21:57:34

Wie wäre es, erst showTowers und dann shuffleTowers aufzurufen?

Antworten