On dispose 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
,
et
, les
disques sont empilés sur le socle de gauche
, ceux du milieu et de droite
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é
se trouve sur un disque
numéroté
avec
(i.e un disque plus petit). Par exemple, si
, 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
et
la place au sommet de la pile
.
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; }