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