Fév 022010
Ce petit bout de code C illustre la résolution du problème des
tours de hanoï par l’utilisation de fonctions récursives.
#include <stdio.h> #include <time.h> //variables globales const int nb=16; int colonne[3][100]; //prototypes int autre(int c1, int c2);//renvoie l'autre colonne (on lui en donne 2 elle renvoie la troisième) void affiche(void);//Affiche l'état des 3 colonnes void deplace1(int s, int d);//Déplace un jeton d'une colonne à une autre void deplacen(int n, int s, int d);//Déplace n jeton(s) d'une colonne à une autre int main(void) { int cpt, col ; for (cpt=0; cpt<100 ; cpt++) for (col=0 ; col<3 ; col++) colonne[col][cpt]=0; for (cpt=0; cpt<nb ; cpt++) colonne[0][cpt]=nb-cpt; affiche(); deplacen(nb,0,2); } void deplacen(int n, int s, int d) { if ( n == 1 ) { deplace1(s,d); return; } deplacen(n-1,s,autre(s,d)); deplace1(s,d); deplacen(n-1,autre(s,d),d); } void deplace1(int s, int d) { int cpts=0, cptd=0; while (colonne[s][cpts]) cpts++ ; while (colonne[d][cptd]) cptd++ ; colonne[d][cptd]=colonne[s][cpts-1] ; colonne[s][cpts-1] = 0 ; affiche(); } int autre(int c1, int c2) { switch (c1) { case 0 : if ( c2 == 1 ) return 2 ; else return 1 ; case 1 : if ( c2 == 0 ) return 2 ; else return 0 ; case 2 : if ( c2 == 0 ) return 1 ; else return 0 ; } } void affiche(void) { int cpt, col; static int etape=0; printf("etape %09u\n",etape++); for (col=0 ; col<3 ; col++) { printf("Colonne %c > ",'A'+col); cpt=0 ; while ( colonne[col][cpt] ) printf("%02u ", colonne[col][cpt++]) ; printf("\n"); } printf("\n"); usleep(1000); }
Sorry, the comment form is closed at this time.