C# :: Aufgabe #66
3 Lösungen

Türme von Hanoi - Lösung
Fortgeschrittener - C#
von bibir
- 05.09.2014 um 11:28 Uhr
Programmiere die Lösung der Türme von Hanoi.
Dabei ist es Ausreichend, die zu tätigenden Schritte textuell auszugeben
Dabei ist es Ausreichend, die zu tätigenden Schritte textuell auszugeben
Lösungen:

using System; namespace Türme_von_Hanoi { class Program { static void Main(string[] args) { int zuege = 0; Console.WriteLine("Geben Sie die Anzahl der Scheiben ein:"); int scheibe = int.Parse(Console.ReadLine()); zuege = anstoß(scheibe, 'A', 'B', 'C', zuege); Console.Write("Es sind mindestens {0} Züge notwendig.", zuege); Console.ReadLine(); } static int bewege(int scheibe, char a, char b, int z) { Console.WriteLine("Bwege Scheibe {0} von {1} zu {2}", scheibe, a, b); return z += 1; } static int anstoß(int scheibe, char a, char b, char c, int z) { if (scheibe == 1) { return bewege(1,a,b,z); } else { z = anstoß(scheibe - 1, a, c, b, z); z = bewege(scheibe, a, b, z); z = anstoß(scheibe - 1, c, b, a, z); return z; } } } }

void Main() { setzeTurm(5,"Start", "Ziel", "Hilfs"); } private static void setzeTurm(int n, string startPlatzName, string zielPlatzName, string hilfsPlatzname) { if (n > 0) { setzeTurm(n-1, startPlatzName, hilfsPlatzname, zielPlatzName); System.Console.WriteLine(string.Format("Bewege Scheibe {0} vom {1}-Platz zum {2}-Platz.", n, startPlatzName, zielPlatzName)); setzeTurm(n-1, hilfsPlatzname, zielPlatzName, startPlatzName); } }
Hier mit rekursiv aufgerufener Move-Funktion. Die Türme wurden durch drei Stacks simuliert.
C#-Code

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Türme_von_Hanoi { class Program { static void Main(string[] args) { Stack<int> turmA = new Stack<int>(7); Stack<int> turmB = new Stack<int>(7); Stack<int> turmC = new Stack<int>(7); // TurmA initialisieren (mit Scheiben bestücken, wobei 6 die grösste und 0 die kleinste darstellt) for (int i = 6; i >= 0; i--) { turmA.Push(i); } MoveDisk(7, ref turmA, ref turmB, ref turmC); } static void MoveDisk(int disk, ref Stack<int> a, ref Stack<int> b, ref Stack<int> c) { if (disk > 0) { MoveDisk(disk - 1, ref a, ref c, ref b); c.Push(a.Pop()); MoveDisk(disk - 1, ref b, ref a, ref c); } } } }