[C++] Hanoi recursief met vectoren

Pagina: 1
Acties:
  • 396 views

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Neophyte808
  • Registratie: Februari 2008
  • Laatst online: 19-09 09:54

Neophyte808

Gadget inspector

Topicstarter
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.

Acties:
  • 0 Henk 'm!

Verwijderd

Het voordeel van vectoren is nou juist dat ze geen vaste grootte hoeven te hebben. Ik zou je beginstate dus ook representeren als:

L: 5 4 3 2 1
M: (<empty vector>)
R: (<empty vector>)

Je probleem is nu gereduceerd to het laatste getal uit een vector halen:
C++:
1
2
int val = L.back();
L.pop_back();

en in een andere queue stoppen:
C++:
1
M.push_back(val);
.

Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 20:29

The Eagle

I wear my sunglasses at night

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.
En nou verwacht je van ons dat wij jouw huiswerk voor je gaan maken? Nofi, think again ;)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Vragen over huiswerk zijn op zich niet zo'n punt maar als je hier domweg je opdracht post en hoopt dat wij het even voor je oplossen dan heb je inderdaad verkeerd gedacht. Van voorzeggen leer je niks.

Als je je aan De Quickstart kan houden kun je een nieuw topic openen maar daar willen we dan wel echt je eigen inzet (ideeën, pogingen, enz.) in zien.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Dit topic is gesloten.