import java.util.Scanner; public class Hanoi { // Mein Lieblingsprogramm :-) // Tuerme von Hanoi // Rekursion fuer Teile & Herrsche: // Teile eine Aufgabe in kleinere Aufgaben // Wenn du die kleineren Aufgaben loesen kannst, loese // sie, wenn nicht, teile sie weiterhin. Dieses // weiterhin teilen geht rekursiv wunderbar. // Paradebeispiel Turm von Hanoi. // Zitat Wikipedia: Das Spiel besteht aus drei Stäben A, B und C, // auf die mehrere gelochte Scheiben gelegt werden, alle verschieden // groß. Zu Beginn liegen alle Scheiben auf Stab A, der Größe nach // geordnet, mit der größten Scheibe unten und der kleinsten oben. // Ziel des Spiels ist es, den kompletten Scheiben-Stapel von A nach // C zu versetzen. // Bei jedem Zug darf die oberste Scheibe eines beliebigen Stabes // auf einen der beiden anderen Stäbe gelegt werden, vorausgesetzt, // dort liegt nicht schon eine kleinere Scheibe. Folglich sind zu // jedem Zeitpunkt des Spieles die Scheiben auf jedem Feld der Größe // nach geordnet. Zitat Ende. // Wir lesen die Hoehe des Turms auf A ein und geben die Zuege zurueck // mit denen das Problem geloest wird. /** Bewege einen Turm der Hoehe n von src zu dest * @param n Hoehe des Turms * @param src Stab mit dem Turm der Hoehe n * @param dest Leerer Stab, auf den der Turm von src bewegt werden soll. * @param tmp Dritter Stab. */ public static void move(int n, String src, String dest, String tmp) { // Wer mehr zu dieser Art Kommentar erfahren will moege sich JavaDoc anschauen. // Wir koennen das Problem fuer einen Turm der Hoehe 1 loesen, aber nicht fuer // n, daher teilen wir das Problem fuer einen Turm der Hoehe n // in kleinere Teilaufgaben. Zuerst bewegen wir n-1 Scheiben // von src nach tmp if(n > 1) move(n - 1, src, tmp, dest); // Es verbleibt eine Scheibe auf src System.out.println("Scheibe von " + src + " nach " + dest); // Und wir muessen noch n-1 Scheiben von tmp nach dest verschieben. if(n > 1) move(n - 1, tmp, dest, src); } public static void main(String... args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); move(n, "A", "C", "B"); // Aufgabe: Wie viele Operationen muessen fuer einen Turm der Hoehe n // ausgefuehrt werden? } }