Hallo, ik probeer het Towers of Hanoi probleem te programmeren in c++. Alle algoritmen die ik gevonden heb op internet printen iets in zo'n trant van "move disk bla from peg bla to peg bla". Zo'n algoritme heb ik zelf ook al geprogrammeerd en dat is ook niet zo lastig, want je kunt gewoon de linkse, middelste en rechtse peg swappen door de volgorde van de parameters te veranderen. Nu: ik wil na elke stap de state printen van een peg, d.w.z: de disks op volgorde van groot naar klein, bijvoorbeeld:
L: 5 4 3 2 1
M: 0 0 0 0 0
R: 0 0 0 0 0
...zou dan de begin state zijn.
Ik wil dit probleem oplossen door gebruik te maken van 3 vectoren die de pegs representeren. Het nadeel van de recursieve hanoi functie is alleen dat het swappen van de volgorde van de vectoren niet dezelfde werking heeft als het swappen van de pegs: de werking van het torens van hanoi probleem zit al impliciet in de recursie en ik vind het daarom lastig om een vector representatie van het probleem te maken. Ik zou namelijk het laatste positieve getal uit de vector (in dit geval 1) moeten vervangen door een 0, en de eerste 0 moeten vervangen door de 1, terwijl het consistent blijft met het hanoi algoritme.
[code=c++]
enum Peg {L,M,R};
int solve_tower (int n, Peg L, Peg M, Peg R)
{
if (n == 0)
return 0; // n kan hier elk getal zijn dat hoger is dan 0, dit is dus niet vantevoren vastgesteld maar wordt
else // meegegeven als parameter.
{
solve_tower (n - 1, L, R, M); // hier moet ik iets met vectoren doen
cout << "Move disk " << n << " from peg " << begin << " to peg " << eind << endl;
solve_tower(n - 1, M, L, R); // ...en hier ook.
}
}
[/code=c++]
btw, een iteratieve oplossing is niet toegestaan, ik doe deze opdracht voor een cursus programmeren (why else zou ik me hier ook mee bezig houden
), en de vereisten zijn dat je recursie gebruikt en vectoren.
L: 5 4 3 2 1
M: 0 0 0 0 0
R: 0 0 0 0 0
...zou dan de begin state zijn.
Ik wil dit probleem oplossen door gebruik te maken van 3 vectoren die de pegs representeren. Het nadeel van de recursieve hanoi functie is alleen dat het swappen van de volgorde van de vectoren niet dezelfde werking heeft als het swappen van de pegs: de werking van het torens van hanoi probleem zit al impliciet in de recursie en ik vind het daarom lastig om een vector representatie van het probleem te maken. Ik zou namelijk het laatste positieve getal uit de vector (in dit geval 1) moeten vervangen door een 0, en de eerste 0 moeten vervangen door de 1, terwijl het consistent blijft met het hanoi algoritme.
[code=c++]
enum Peg {L,M,R};
int solve_tower (int n, Peg L, Peg M, Peg R)
{
if (n == 0)
return 0; // n kan hier elk getal zijn dat hoger is dan 0, dit is dus niet vantevoren vastgesteld maar wordt
else // meegegeven als parameter.
{
solve_tower (n - 1, L, R, M); // hier moet ik iets met vectoren doen
cout << "Move disk " << n << " from peg " << begin << " to peg " << eind << endl;
solve_tower(n - 1, M, L, R); // ...en hier ook.
}
}
[/code=c++]
btw, een iteratieve oplossing is niet toegestaan, ik doe deze opdracht voor een cursus programmeren (why else zou ik me hier ook mee bezig houden