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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

E–56 ESERCIZI E PROGETTI DI PROGRAMMAZIONE<br />

Figura 6<br />

Torri <strong>di</strong> Hanoi<br />

}<br />

}<br />

}<br />

return a;<br />

public boolean hasMorePermutations()<br />

{<br />

if (a.length 0; i––)<br />

{<br />

if (a[i – 1] < a[i]) { return true; }<br />

}<br />

return false;<br />

}<br />

public void swap(int i, int j)<br />

{<br />

int temp = a[i];<br />

a[i] = a[j];<br />

a[j] = temp;<br />

}<br />

public void reverse(int i, int j)<br />

{<br />

while (i < j) { swap(i, j); i++; j––; }<br />

}<br />

L’algoritmo sfrutta una proprietà dell’insieme da permutare, che contiene numeri <strong>di</strong>stinti: non<br />

potete, quin<strong>di</strong>, usare lo stesso algoritmo per calcolare le permutazioni dei caratteri in una stringa.<br />

Potete, però, usare questa classe per ottenere tutte le permutazioni delle posizioni dei caratteri,<br />

per poi comporre una stringa il cui i-esimo carattere sia word.charAt(a[i]). Usate questo approccio<br />

per realizzare nuovamente, senza ricorsione, la classe PermutationIterator dell’esercizio<br />

precedente<br />

** <strong>Esercizi</strong>o P12.13. Torri <strong>di</strong> Hanoi. Si tratta <strong>di</strong> un famoso rompicapo. Bisogna spostare una pila <strong>di</strong><br />

<strong>di</strong>schi <strong>di</strong> grandezza decrescente dal piolo più a sinistra a quello più a destra. Il piolo centrale si<br />

può usare per riporre i <strong>di</strong>schi temporaneamente (osservate la Figura 6). Si può muovere un <strong>di</strong>sco<br />

alla volta, da un piolo a un altro, e si possono sovrapporre solamente <strong>di</strong>schi <strong>di</strong> misura inferiore su<br />

<strong>di</strong>schi più gran<strong>di</strong>, ma non viceversa.<br />

Scrivete un programma che stampi le mosse necessarie per risolvere il rompicapo per un numero n<br />

<strong>di</strong> <strong>di</strong>schi (all’inizio del programma chiedete all’utente il valore <strong>di</strong> n). Stampate le mosse da eseguire<br />

in questa forma:<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!