/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E S O L U T I O N   D U   P R O B L E M E   D E S   T O U R S   D E   H A N O I  :                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xtc/ToursDeHanoi.02$c' :                                                                                       */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 20150915173154).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#include  "INCLUDES.01.I"

extern    double    log10();

#define   N_DISQUES                                                                                                                     \
                    4
#define   N_CHIFFRES                                                                                                                    \
                    (((int)log10(N_DISQUES))+1)

#define   N_PLOTS                                                                                                                       \
                    3
#define   A                                                                                                                             \
                    (0)
#define   B                                                                                                                             \
                    ((A)+1)
#define   C                                                                                                                             \
                    ((B)+1)

#define   CHAINE(x)                                                                                                                     \
                    ('A'+x)

int       disque[N_DISQUES];
                                        /* Ce vecteur indique sur quel plot se situe chaque disque (de 1 a D) a l'instant present,   */
                                        /* le disque 'INDEX0' etant le plus gros et 'NombreVersIndex(D)' le plus petit...            */
int       hauteur[N_PLOTS];
                                        /* Ce vecteur indique le nombre de disques ("hauteur") sur chaque plot...                    */

void      deplacement(int n,int a,int c,int b)
          {
          if        (n == 1)
                    {
                    int       index;
                    int       iterer=VRAI;

                    printf("%c --> %c",CHAINE(a),CHAINE(c));
                                        /* Indication du mouvement courant : le disque du haut du plot 'a' est mis en haut du        */
                                        /* plot 'c'.                                                                                 */

                    printf(" : ");

                    for       (index=INDEX0 ; index<=NombreVersIndex(N_DISQUES) ; index++)
                              {
                              printf("%c",CHAINE(disque[index]));
                                        /* Indication de la localisation (sur quel plot ?) de chaque disque avant le mouvement       */
                                        /* precedent (a --> c) en mettant le plus grand a gauche et le plus petit a droite...        */
                              }

                    printf(" {%0*d,%0*d,%0*d} ",N_CHIFFRES,hauteur[A],N_CHIFFRES,hauteur[B],N_CHIFFRES,hauteur[C]);
                                        /* Edition des "hauteurs" avant le mouvement precedent...                                    */

                    printf(" --> ");

                    index=NombreVersIndex(N_DISQUES);

                    while     (iterer == VRAI)
                              {
                              if        (disque[index] == a)
                                        {
                                        disque[index]=c;
                                        /* On recherche le numero du disque situe en haut du plot 'a', puis on le deplace en         */
                                        /* haut du plot 'c' (a --> c).                                                               */
                                        iterer=FAUX;
                                        }
                              else
                                        {
                                        index--;
                                        }
                              }

                    hauteur[a]--;
                    hauteur[c]++;
                                        /* La hauteur du plot 'a' diminue quand celle de 'c' augmente...                             */

                    for       (index=INDEX0 ; index<=NombreVersIndex(N_DISQUES) ; index++)
                              {
                              printf("%c",CHAINE(disque[index]));
                                        /* Indication de la localisation (sur quel plot ?) de chaque disque apres le mouvement       */
                                        /* precedent (a --> c) en mettant le plus grand a gauche et le plus petit a droite...        */
                              }

                    printf(" {%0*d,%0*d,%0*d} ",N_CHIFFRES,hauteur[A],N_CHIFFRES,hauteur[B],N_CHIFFRES,hauteur[C]);
                                        /* Edition des "hauteurs" apres le mouvement precedent...                                    */

                    printf("\n");

                    if        ((hauteur[A]+hauteur[B]+hauteur[C]) != N_DISQUES)
                              {
                              printf("ERREUR de comptage\n");
                              }
                    else
                              {
                              }
                    }
          else
                    {
                    deplacement(n-1,a,b,c);
                    deplacement(1,a,c,b);
                    deplacement(n-1,b,c,a);
                    }
          }

main()
          {
          int       index;

          for       (index=INDEX0 ; index<=NombreVersIndex(N_DISQUES) ; index++)
                    {
                    disque[index]=A;
                                        /* Tous les disques sont initialement sur le plot 'A'.                                       */
                    }

          hauteur[A]=N_DISQUES;
          hauteur[B]=0;
          hauteur[C]=0;

          deplacement(N_DISQUES,A,C,B);
          }



Copyright © Jean-François Colonna, 2021-2023.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2021-2023.