 
 
 
 
 
 
 
  
On dispose de  disques numérotés de
 disques numérotés de  à
 à  . Les disques peuvent
être empilés sur des socles à partir du moment où tout disque repose
sur un disque de numéro plus élevé. On dispose de trois socles
. Les disques peuvent
être empilés sur des socles à partir du moment où tout disque repose
sur un disque de numéro plus élevé. On dispose de trois socles  ,
,
 et
 et  , les
, les  disques sont empilés sur le socle de gauche
 disques sont empilés sur le socle de gauche
 , ceux du milieu et de droite
, ceux du milieu et de droite  et
 et  sont vides. Le but
est de déplacer toute la pile de disques sur le socle de droite,
sachant qu'on ne peut déplacer les disques que un par un, et qu'il ne
faut qu'à aucun moment, un disque numéroté
 sont vides. Le but
est de déplacer toute la pile de disques sur le socle de droite,
sachant qu'on ne peut déplacer les disques que un par un, et qu'il ne
faut qu'à aucun moment, un disque numéroté  se trouve sur un disque
numéroté
 se trouve sur un disque
numéroté  avec
 avec  (i.e un disque plus petit). Par exemple, si
 (i.e un disque plus petit). Par exemple, si
 , on a
, on a
  1
  2
  3
------------
  2
  3       1
------------
  3   2   1
------------
      1
  3   2
------------
      1
      2   3
------------
  1   2   3
------------
          2
  1       3
------------
          1
          2
          3
------------
On dispose d'un sous-programme 
 qui enlève le disque se trouvant au sommet de la pile
 qui enlève le disque se trouvant au sommet de la pile  et
la place au sommet de la pile
 et
la place au sommet de la pile  .
.
 permettant de déplacer
 permettant de déplacer  disques du socle
 disques du socle  au
  socle
 au
  socle  en utilisant
 en utilisant  comme socle intermédiaire.
 comme socle intermédiaire.
 disques,
 disques, 
Fichier source à compléter :
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
/*
  Nous representerons les 3 socles par un tableau de 3 pointeurs.
  Chaque pointeur, de type int*, aura pour cible un tableau 
  alloue dynamiquement qui contiendra les disques. La premiere case
  contiendra le nombre de disques poses sur le socle, et les cases
  suivantes contiendront les disques, en commencant par celui qui 
  est en bas de la pile.
  
*/
/************************************************************************/
/*
  Retourne la plus grande valeur parmi i et j
*/
int max2(int i, int j)
{
  return 0;
}
/************************************************************************/
/*
  Retourne la plus grande valeur parmi i, j et k
*/
int max3(int i, int j, int k)
{
  return 0;
}
/************************************************************************/
/*
  Alloue dynamiquement la memoire permettant de stocker n disques.
  Retourne un pointeur vers l'espace alloue.
*/
int* creeSocle(int nbDisques)
{
  return NULL;
}
/************************************************************************/
/*
  Place nbDisques disques dans le socle s.
*/
void initSocle(int* s, int nbDisques)
{
}
/************************************************************************/
/*
  Initialise les pointeurs de s et place nnDisques disques
  dans le premier socle.
*/
void creeSocles(int** s, int nbDisques)
{
}
/************************************************************************/
/*
  Affiche les 3 socles.
*/
void afficheSocles(int** s)
{
}
/************************************************************************/
/*
  Libere les trois tableaux alloues dynamiquement.
*/
void libereSocles(int** s)
{
}
/************************************************************************/
/*
  Deplace le disque se trouvant au sommet du socle socleSource
  sur le sommet du socle socleDestination.
*/
void deplaceDisque(int* socleSource, int* socleDestination)
{
}
/************************************************************************/
/*
  Deplace n disques du socle sFrom vers le socle sTo en utilisant
  sVia comme espace de stockage intermediaire. Affiche toutes les 
  etapes.
*/
void deplaceDisques(int n, int** s, int sFrom, int sVia, int sTo)
{
}
/************************************************************************/
/*
  Teste le deplacement de trois disques.
*/
int main()
{
  int* s[3];
  int nbDisques = 3;
  creeSocles(s, nbDisques);
  afficheSocles(s);  
  deplaceDisques(nbDisques, s, 0, 1, 2);
  libereSocles(s);
  return 0;
}
 .
.
 disques. Résolvez-là.
 disques. Résolvez-là.  
 disques en un temps
  raisonnable ?
 disques en un temps
  raisonnable ? 
 
 
 
 
 
 
