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.