Knobelspielproblem - Türme von Hanoi geschlossen 

Status
Für weitere Antworten geschlossen.

xparet0209

Registered +
Registriert
Okt. 2007
Beiträge
435
hi liebe community
ich habe wieder ein problem
und zwar betrifft es das oben genannte spiel: "Türme von Hanoi"

ihr könnt es euch allgemein bei wiki durchlesen (dazu auf den Names klicken)
aber kurzgesagt:
- 3 türme
- n scheiben unterschiedlicher größe
- nur kleinere scheiben dürfen auf größere
- immer nur eine scheibe pro zug

am anfang sind sie der größe nach geordnet (groß unten)
aufgabe ist es nun die scheiben den regeln nach auf den letzten turm zu bringen (wieder groß unten)


der algorithmus ist bei 3 türmen noch relativ einfach (rekursiv)
mein problem ist es nun den algortihmus auf n türme zu verallgemeinern

könnte mir jmd da helfen?
mfg xparet0209

PS:
quellcode wird hinzugefügt
vllt visualisiere ich meine idee auch noch...
 
Zuletzt bearbeitet von einem Moderator:
Code:
erster Aufruf (start)
PHP:
....
stufe += 1;
moveTowers(Towers, 0, anz_scheiben, anz_towers - 1); // bewegt ersten stapel auf letzten
stufe -= 1;
....

PHP:
static Stack[] moveTowers(Stack[] Towers, int quellTurm, int org_nElemente, int zielTurm)
{
//algorithmus nutzt nur einen hilfsturm aus
int nElemente = org_nElemente;
int[] tempZielArr = findTemp(Towers,quellTurm,zielTurm);


if (nElemente == 1 || nElemente == 0 ) 
{
Towers[zielTurm].push(Towers[quellTurm].pop()); //
showTowers(Towers);
moves++;
}
else
{ 
// temp ausfüllen
for (int a = 0; a < tempZielArr.Length; a++)
{
if (a == 0)
{
nElemente = nElemente - (tempZielArr.Length - a);
}
else
{
nElemente = 1;
}
//if (Towers[quellTurm].size() - nElemente > 0) // ist falsch wenn zu viele hilfstürme da sind wird aber nciht erkannt wenn noch andere zahlen darunter liegen
if (org_nElemente - nElemente-a > 0 ) 
{
stufe += 1;
Towers = moveTowers(Towers, quellTurm, nElemente, tempZielArr[a]);
stufe -= 1;
}
}


stufe += 1;
Towers = moveTowers(Towers, quellTurm, 1, zielTurm); // letztes element auf ziel turm
stufe -= 1;



// temp aufräumen auf ziel
for (int a = tempZielArr.Length - 1; a >= 0; a--)
{
if (Towers[tempZielArr[a]].top() != 0)
{
stufe += 1;
Towers = moveTowers(Towers, tempZielArr[a], nElemente, zielTurm);
stufe -= 1;
}
} 
}


return Towers;
}

PHP:
static int[] findTemp(Stack[]Towers,int quellTurm, int zielTurm)
{
int[] tempZielArr = new int[Towers.Length-2];
int tempZielArrCounter = 0;


// temp finden
for (int i = 0; i < Towers.Length; i++)
{
if ((i != quellTurm && i != zielTurm) && (Towers[quellTurm].top() < Towers[i].top() || Towers[i].top() == 0))
{
tempZielArr[tempZielArrCounter] = i;
tempZielArrCounter++;
}
}

return tempZielArr;
}

zum quellcode:
ich habe eine eigene stack klasse und ne show methode
dies dürfte euch aber eig nicht interessiert, da nicht notwendig zum verständnis ist :)

push - rauflegen
pop - wegwerfen (liefert weggeworfenen wert zurück)
top - oberster wert
size - größe

ich glaube ich erkläre die funktionsweise das algorithmus am besten visual:
(hier mit 3 türmen)





das problem liegt in diesem beispiel (4 türme , 4 scheiben)
towers1.jpg


soweit läuft alles wie geplant
doch jetzt:
towers2t.jpg
 
Zuletzt bearbeitet von einem Moderator:
Status
Für weitere Antworten geschlossen.

Ähnliche Themen

Zurück
Oben Unten