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);
}
}
}
}
