Turm von Haoi - 4 Scheiben 4 Türme

Status
Nicht offen für weitere Antworten.

xavie33

Mitglied
Code:
public class Test1 {
	static int zug;
	
  static void Tow (String Quelle, String Hilf1, String Hilf2, String Ziel, int n) {
    if (n ==1)
      System.out.println ("Bewege Scheibe " +n+ " von " + Quelle + " nach " + Ziel);
    else {
      Tow (Quelle, Ziel, Hilf1, Hilf2, n-1);
      System.out.println ("Bewege Scheibe " +n+ " von " + Quelle + " nach " + Ziel);
      Tow (Hilf1, Hilf2, Quelle, Ziel, n-1);
      zug=zug+1;
    }
  }
 
  public static void main (String args []) {
    System.out.println ("Tuerme von Hanoi; 4 Türme 4 Scheiben");
    System.out.println ("");
    Tow ("Quelle", "Hilfsziel1", "Hilfsziel2","Ziel", 4);
    System.out.println();
    System.out.println();
    System.out.println("Das waren " + zug + " Zuege");
  }
}

Ausgabe:

Code:
Tuerme von Hanoi; 4 Türme 4 Scheiben

Bewege Scheibe 1 von Quelle nach Ziel
Bewege Scheibe 2 von Quelle nach Hilfsziel1
Bewege Scheibe 1 von Hilfsziel2 nach Hilfsziel1
Bewege Scheibe 3 von Quelle nach Hilfsziel2
Bewege Scheibe 1 von Ziel nach Quelle
Bewege Scheibe 2 von Ziel nach Hilfsziel2
Bewege Scheibe 1 von Hilfsziel1 nach Hilfsziel2
Bewege Scheibe 4 von Quelle nach Ziel
Bewege Scheibe 1 von Hilfsziel1 nach Hilfsziel2
Bewege Scheibe 2 von Hilfsziel1 nach Quelle
Bewege Scheibe 1 von Ziel nach Quelle
Bewege Scheibe 3 von Hilfsziel1 nach Ziel
Bewege Scheibe 1 von Hilfsziel2 nach Hilfsziel1
Bewege Scheibe 2 von Hilfsziel2 nach Ziel
Bewege Scheibe 1 von Quelle nach Ziel


Das waren 7 Zuege

Was ist an diesem Code falsch?
 
S

SlaterB

Gast
Tow (Quelle, Ziel, Hilf1, Hilf2, n-1);
System.out.println ("..");
Tow (Hilf1, Hilf2, Quelle, Ziel, n-1);

n-1 legst du erst auf Hilf2, dann gibst du aber Hilf1 als Quelle an,
mit
Tow (Quelle, Ziel, Hilf1, Hilf2, n-1);
System.out.println ("..");
Tow (Hilf2, Hilf1, Quelle, Ziel, n-1);

scheint es besser zu klappen
 

xavie33

Mitglied
Die Ausgabe der Anazhl der Zuege (zug=zug+1; ) habe ich nun mal eine Klammer nach unten geschoben, somit stimmt das schon mal.

Code:
      }
  zug=zug+1;
  }



@SlaterB:

Die Änderung von Hilf1 auf Hilf2 bringt leider nichts, kommen trotzdem noch 15 Zuege raus. Müssten aber max. 9 sein, so wie ich das sehe.
 
S

SlaterB

Gast
war nicht vorher irgendwo mal die Frage
'warum wird Zeile xy doppelt ausgegeben?'?
hast du die entfernt?

und was heißt hier bringt nix, vorher war es falsch, nun ist es richtig ;)
auf die Anzahl der Aufrufe hat das natürlich keine Auswirkungen, da könntest du genauso immer 'von 1 nach 1' schreiben,
aber 'von 1 nach 3, 3 nach 1' usw. ist nunmal die korrekte Anleitung

auch die 15 sind meiner Meinung nach korrekt, kommt natürlich auf die Definition eines vollständigen Zuges an,
zähle doch mal die 9 Züge auf, die du haben willst?
 

xavie33

Mitglied
Ja hatte vor deiner Antwort die Frage noch verändert.

So wie er das Ergebnis ausgibt ist das schon richtig. Ich wollte nur wissen ob es möglich ist, das er das Minimum an Zuegen ausgibt, sprich 9 Zuege.

Aktuell bekomme ich:

Code:
Bewege Scheibe 1 von Quelle nach Ziel
Bewege Scheibe 2 von Quelle nach Hilfsziel1
Bewege Scheibe 1 von Ziel nach Hilfsziel1
Bewege Scheibe 3 von Quelle nach Hilfsziel2
Bewege Scheibe 1 von Hilfsziel1 nach Quelle
Bewege Scheibe 2 von Hilfsziel1 nach Hilfsziel2
Bewege Scheibe 1 von Quelle nach Hilfsziel2
Bewege Scheibe 4 von Quelle nach Ziel
Bewege Scheibe 1 von Hilfsziel2 nach Hilfsziel1
Bewege Scheibe 2 von Hilfsziel2 nach Quelle
Bewege Scheibe 1 von Hilfsziel1 nach Quelle
Bewege Scheibe 3 von Hilfsziel2 nach Ziel
Bewege Scheibe 1 von Quelle nach Hilfsziel2
Bewege Scheibe 2 von Quelle nach Ziel
Bewege Scheibe 1 von Hilfsziel2 nach Ziel

kürzer wäre es:

Code:
Bewege Scheibe 1 von Quelle nach Ziel
Bewege Scheibe 2 von Quelle nach Hilfsziel1
Bewege Scheibe 1 von Ziel nach Hilfsziel1
Bewege Scheibe 3 von Quelle nach Hilfsziel2
Bewege Scheibe 4 von Quelle nach Ziel
Bewege Scheibe 3 von Hilfsziel2 nach Ziel
Bewege Scheibe 1 von Hilfsziel1 nach Hilfsziel2
Bewege Scheibe 2 von Hilfsziel1 nach Ziel
Bewege Scheibe 1 von Hilfsziel2 nach Ziel
 
S

SlaterB

Gast
was du gebaut hast ist:
'Stapel n von a nach b:
1. Schritt: Stapel n-1 von a nach c,
2. Schritt: n von a nach b
3. Schritt: Stapel n-1 von c nach b'

das würde also mit 3 Stapeln genauso lange dauern, den 4. nutzt du gar nicht richtig,

spontan denke ich dass folgendes mit dem 4. Stapel ablaufen soll:
'Stapel n von a nach b:
1. Schritt: Stapel n-2 von a nach d,
2. Schritt: n-1 von a nach c,
3. Schritt: n von a nach b
4. Schritt: n-1 von c nach b,
5. Schritt: Stapel n-2 von d nach b'

dann dürften nur 9 Schritte nötig sein, so wie du dir das wünschst,
ist ein ganz neuer Algorithmus, wenn auch recht ähnlich,
musst nur ein wenig deine Tow-Aufrufe und System.out.println dazwischen ändern,
und aufpassen da nun n-2 ins Spiel kommt und nicht nur n-1
 

Leroy42

Top Contributor
Ich glaube nicht, das es einfach ist, einen Algorithmus
für 4 Stangen mal so einfach zu coden.

Hier mal ein Link zu einem, leider unbeantworteten Thread von mir.

Türme von Hanoi mit k Stangen

Im ersten Post ist ein Link auf ein Java-Programm von mir, mit dem
man Türme von Hanoi für k Stangen selbst erkunden kann.
 

xavie33

Mitglied
Nettes Programm gibt mir das gleiche Ergebnis (15 Züge) an. Hast schon Recht mit einer Stange mehr braucht man nen neuen Algorythmus leider.
 
S

SlaterB

Gast
Jo, der Vorschlag von mir ist dann schon eine ganz nette Näherung, findet aber bei höheren Zahlen längst nicht mehr den optimalen Weg.

Ist das das Ziel? Ist das eine normale Hausaufgabe (heftig, wo?) oder privat?
 

xavie33

Mitglied
Ne die normale Aufgabe bestand nur darin die Scheiben von der Quelle auf das Ziel zu schieben.

Hatte mich nur nebenbei interessiert ob es Möglich ist auch noch das Minimum an Zügen zu bestimmen.
 

Leroy42

Top Contributor
xavie33 hat gesagt.:
Hatte mich nur nebenbei interessiert ob es Möglich ist auch noch das Minimum an Zügen zu bestimmen.

Was sicher möglich ist, mich auch brennend interessiert :D
ich aber bisher leider noch nicht herausbekommen habe :(

Ich habe mein Programm übrigens so erweitert, daß
es die minimale Zuganzahl selbst findet, (mittels
Backtracking mit eines Haufens von Baumbeschneidungen)
kann in der Ausgabe (n Scheiben, k Stanken) aber leider noch
kein System erkennen. :(

Falls es dich interessiert, kann ich dir das aktuelle
Programm ja mal mailen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Balken-Turm Java Basics - Anfänger-Themen 26

Ähnliche Java Themen

Neue Themen


Oben