/* File: hanoi.c */
/* Time-stamp: "2001-03-27 20:34:02 calvanes" */
/* Scopo: esempio di funzione con ricorsione multipla */

/* Programma delle Torri di Hanoi, con richiesta del numero di dischi, della
sorgente e della destinazione da input. */

#include <stdio.h>


void muoviUnDisco(int sorgente, int destinazione)
{
printf(" muovi un disco da %2d a %2d\n", sorgente, destinazione);
} /* muoviUnDisco */


void muovi(int n, int sorgente, int destinazione, int ausiliario)
{
if (n == 1)
muoviUnDisco(sorgente, destinazione);
else {
muovi(n-1, sorgente, ausiliario, destinazione);
muoviUnDisco(sorgente, destinazione);
muovi(n - 1, ausiliario, destinazione, sorgente);
}
} /* muovi */


int main(void)
{
int dischi; /* numero di dischi */
int s, d; /* pali sorgente e destinazione */

printf("Numero di dischi? ");
scanf("%d", &dischi);
printf("Palo sorgente? [1, 2 o 3] ");
scanf("%d", &s);
printf("Palo destinazione? [1, 2 o 3] ");
scanf("%d", &d);
printf("\nIl palo ausiliario e` %d\n", 6 - d - s);
printf("Per %d dischi le mosse richieste sono:\n", dischi);
muovi(dischi, s, d, 6 - d - s);
putchar('\n');

return 0;
} /* main */