Code:
erster Aufruf (start)
PHP-Code:
....
stufe += 1;
moveTowers(Towers, 0, anz_scheiben, anz_towers - 1); // bewegt ersten stapel auf letzten
stufe -= 1;
....
PHP-Code:
static Stack<int>[] moveTowers(Stack<int>[] 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-Code:
static int[] findTemp(Stack<int>[]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)
soweit läuft alles wie geplant
doch jetzt: