/* 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 */