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