31.05.2013 Views

Esercizi e progetti di programmazione - Apogeo

Esercizi e progetti di programmazione - Apogeo

Esercizi e progetti di programmazione - Apogeo

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!