/*************************************************************************************************************************************/
/* */
/* 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);
}