Esercizi e progetti di programmazione - Apogeo
Esercizi e progetti di programmazione - Apogeo
Esercizi e progetti di programmazione - Apogeo
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Move <strong>di</strong>sk from peg 1 to peg 3<br />
ESERCIZI E PROGETTI DI PROGRAMMAZIONE E–57<br />
Suggerimento: realizzate una classe DiskMover (trasportatore <strong>di</strong> <strong>di</strong>schi), il cui costruttore riceve:<br />
• il piolo sorgente, source, da cui prelevare i <strong>di</strong>schi (1, 2 o 3)<br />
• il piolo destinazione, target, in cui inserire i <strong>di</strong>schi (1, 2 o 3)<br />
• il numero <strong>di</strong> <strong>di</strong>schi da spostare, <strong>di</strong>sks<br />
Un trasportatore <strong>di</strong> <strong>di</strong>schi che sposta un solo <strong>di</strong>sco da un piolo a un altro ha un metodo nextMove<br />
che restituisce semplicemente la stringa:<br />
Move <strong>di</strong>sk from peg source to peg target<br />
Un trasportatore <strong>di</strong> <strong>di</strong>schi che deve spostare più <strong>di</strong>schi deve faticare <strong>di</strong> più e ha bisogno <strong>di</strong> un altro<br />
oggetto <strong>di</strong> tipo DiskMover che lo aiuti. Nel costruttore, costruite l’altro oggetto in questo modo:<br />
DiskMover(source, other, <strong>di</strong>sks – 1), dove other è il piolo <strong>di</strong>verso da source e da target.<br />
Il metodo nextMove chiede a tale trasportatore <strong>di</strong> <strong>di</strong>schi “ausiliario” quale sia la sua successiva<br />
mossa, fi nché non ha terminato. L’effetto è quello <strong>di</strong> spostare <strong>di</strong>sks – 1 <strong>di</strong>schi sul piolo other.<br />
Quin<strong>di</strong>, il metodo nextMove scrive il comando per spostare un <strong>di</strong>sco dal piolo source al piolo<br />
target. Infi ne, costruisce un altro trasportatore <strong>di</strong> <strong>di</strong>schi, DiskMover(other, target, <strong>di</strong>sks –<br />
1), che genera le mosse necessarie a spostare i <strong>di</strong>schi dal piolo other al piolo target.<br />
Suggerimento: è utile tenere traccia dello stato del trasportatore <strong>di</strong> <strong>di</strong>schi:<br />
• BEFORE_LARGEST: il trasportatore ausiliario sposta la pila più piccola sul piolo other<br />
• LARGEST: sposta il <strong>di</strong>sco più grande dall’origine alla destinazione<br />
• AFTER_LARGEST: il trasportatore ausiliario sposta la pila più piccola dal piolo other alla destinazione<br />
• DONE: tutte le mosse sono state eseguite<br />
Collaudate il vostro programma in questo modo:<br />
DiskMover mover = new DiskMover(1, 3, n);<br />
while (mover.hasMoreMoves())<br />
{<br />
System.out.println(mover.nextMove());<br />
}<br />
*** <strong>Esercizi</strong>o P12.14. Uscire da un labirinto. Vi trovate all’interno <strong>di</strong> un labirinto, nella posizione<br />
in<strong>di</strong>cata da un punto (.); le mura del labirinto sono rappresentate da asterischi (*).<br />
* *******<br />
* * *<br />
* ***** *<br />
* * * *<br />
* * *** *<br />
* * *<br />
*** * * *<br />
* * *<br />
******* *<br />
Per uscire dal labirinto, usate la seguente strategia ricorsiva. Se vi trovate accanto a un’uscita, restituite<br />
true. Controllate ricorsivamente se potete uscire da una delle caselle vuote a<strong>di</strong>acenti, senza<br />
tornare nella posizione attuale. Tale metodo verifi ca, semplicemente, se esiste un percorso per uscire<br />
dal labirinto: riceverete una valutazione migliore se siete in grado <strong>di</strong> visualizzare il percorso che<br />
vi conduce all’uscita.<br />
Cay Horstmann: Concetti <strong>di</strong> informatica e fondamenti <strong>di</strong> Java 5 a ed. - Copyright 2010 <strong>Apogeo</strong> srl