{

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   ##                              ##
   ##                              ##
   ##         #####               ######    #####    ##   ##   ######
   ##             ##               ##      ##   ##   ##   ##   ##   ##
   ##         ######               ##      ##   ##   ##   ##   ##
   ##        ##   ##               ##      ##   ##   ##   ##   ##
   #######    ######                ####    #####     ######   ##
        


        ##      ##     ##   ##
        ##      ##     ##   ##                                  ##  ##
    ######     ##      ##   ##    #####    ######     #####
   ##   ##             #######        ##   ##   ##   ##   ##      ##
   ##   ##             ##   ##    ######   ##   ##   ##   ##      ##
   ##   ##             ##   ##   ##   ##   ##   ##   ##   ##      ##
    ######             ##   ##    ######   ##   ##    #####        ##


   par S.M. pour le "Petit Amiga Illustré"     
                    /\/\/\/\/\/\/\/\/\/\/\


        Explications :
        ============

     -»» C'est un classique en informatique ... Il est possible d'adapter
         ce petit source pascal à tout autre langage récursif.
        
         Dans ce problème il y a 3 piquets. Sur le piquet 1 sont empilés
         n disques concentriques. Le diamètre d'un disque doit TOUJOURS
         être inférieur à celui du disque sur lequel il repose : LE PLUS
         GRAND DES DISQUES EST DONC LA BASE DE LA TOUR.

         Les piquets 2 et 3 sont au départ vides. Le problème consiste
         à déplacer l'ensemble des des n disques du piquet 1 au piquet
         3 et en ne prenant qu'un seul piquet à la fois.

         Bien entendu il faut vérifier qu'à tout instant un disque ne
         repose jamais sur un autre de diamètre inférieur ...
                                                                

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

}
program HANOI(input,output);

{**- VARIABLES GLOBALES -**}
VAR 
  a : integer;
  b : integer;
  c : integer;

{**- PROCEDURE RECURSIVE PRINCIPALE -**}
Procedure tour(VAR n : integer;
               VAR i : integer;
               VAR j : integer);
VAR 
  k : integer;
  l : integer;

begin
  if n=1 then
    writeln('Déplacer le disque ', i , ' vers le disque ' , j )
  else     
    begin
      k:= 6 - i - j;
      l:= n - 1;
      tour(l,i,k);
      l:= 1;
      tour(l,i,j);
      l:= n - 1;
      tour(l,k,j);
    end  
end;    

{**- MAIN : FONCTION PRINCIPALE ET POINT D'ENTREE -**}
begin


  writeln;

  writeln("\t\t\tLe problème de la tour d'Hanoï");
  writeln("\t\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

  writeln;

  write("NOMBRE DE DISQUES : ");
  readln(a);
  write("PIQUET DE DEPART  : ");
  readln(b);
  write("PIQUET D'ARRIVEE  : ");
  readln(c);

  writeln;

  tour(a,b,c);

  write("** Appuyez sur une touche pour continuer");
  readln;
end.
{**- FIN DU PROGRAMME -**}
