{ File: hanoi.pas }

{ Scopo: esempio di procedura con ricorsione multipla }

program Hanoi;
{ Programma delle Torri di Hanoi, con richiesta del numero di dischi, della
  sorgente e della destinazione da input. }

const
  MaxDischi = 10;

type
  TipoDischi = 1..MaxDischi;
  TipoPalo   = 1..3;

var
  s, d, a : TipoPalo;
  dischi  : TipoDischi;

  procedure Muovi (n                                  : TipoDischi;
                   sorgente, destinazione, ausiliario : TipoPalo);

    procedure MuoviUnDisco;
    begin
      writeln(' muovi un disco da ', sorgente:2, ' a ', destinazione:2)
    end; { MuoviUnDisco }

  begin { Muovi }
    if n = 1 then
      MuoviUnDisco
    else
    begin
      Muovi(n - 1, sorgente, ausiliario, destinazione);
      MuoviunDisco;
      Muovi(n - 1, ausiliario, destinazione, sorgente);
    end
  end; { Muovi }


begin { Hanoi }
  write('Numero di dischi? ');
  readln(dischi);
  write('Palo sorgente?     [1, 2 o 3] ');
  readln(s);
  write('Palo destinazione? [1, 2 o 3] ');
  readln(d);
  writeln;
  writeln('Il palo ausiliario e'' ', 6-s-d);
  writeln('Per ', dischi:2, ' dischi le mosse richieste sono:');
  Muovi(dischi, s, 6-s-d, d);
  writeln;
end. { Hanoi }