Bonjour à tous !
J'ai un problème avec un exercice bien connu en C : le jeu des tours de Hanoi.
Le principe est simple :
On dispose de trois socles. L'un de ces socles contient n anneaux, rangés par taille décroissante. Le but est de déplacer ces n anneaux du premier socle (socle A) sur le socle C, en s'aidant d'un socle intermédiaire noté B. Les règles de déplacement des anneaux sont simples : un seul anneau peut-être déplacé à la fois, et un anneau peut être posé que sur un autre anneau de plus grande taille.
Dans mon exercice, les socles sont matérialisés par des piles. Voici la structure :
Code:
1
2
3
4
5
6 typedef struct maillon { int v; struct maillon* suiv; }Maillon; typedef Maillon* Pile;
On commence par remplir la pile A avec le nombre d'anneaux voulu :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Pile Remplir (void) { int n,i; Pile A; A=pilenouv(); printf("Entrez le nombre d\'anneaux : "); scanf("%d",&n); for (i=1;i<=n;i++) { A=empiler(A,i); } return A; }
Ensuite, on a une fonction nommé Hanoi, qui utilise la récursivité pour résoudre le problème :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 void Hanoi (Pile A, Pile B, Pile C, int n) { if (n==1) { C=empiler(C,tete(A)); A=depiler(A); } else { Hanoi (A,C,B,n-1); B=empiler(B,tete(A)); A=depiler(A); Hanoi (B,A,C,n-1); } }
Voici la main :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int main (void) { Pile A,B,C; A=Remplir(); B=pilenouv(); C=pilenouv(); Hanoi(A,B,C,longueur(A)); return 0; }
Et si besoin est, voici la liste des fonctions appelés par les fonctions Hanoi et Remplir :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 Pile pilenouv (void) { return NULL; } Pile empiler (Pile p, int data) { Pile sauv=p; p=(Pile)malloc(sizeof(Maillon)); if (p==NULL) {printf("Erreur d\'allocation memoire ... !\n");exit(1);} p->v=data; p->suiv=sauv; return p; } Pile depiler (Pile p) { Pile tete=p; if (vide(p)) {printf("On ne peut depiler une pile vide ... \n");exit(1);} p=p->suiv; free(tete); return p; } int longueur (Pile p) { int l=0; while (p!=NULL) { p=p->suiv; ++l; } return l; }
Premièrement, je ne suis pas du tout sûr que cet algorithme soit bon. Il compile sans soucis, mais je sais pas comment m'y prendre pour qu'à l'écran, on obtienne les différentes étapes. Par exemples, pour n=2, je voudrais que le programme affiche :
Operation 1 : je prends l'anneau de A et je le mets sur B
Operation 2 : je prends l'anneau de A et je le mets sur C
Opération 3 : je prends l'anneau de B et je le mets sur C
FIN.
Quelqu'un peut-il m'aider à finir ce programme ?
Merci d'avance, et n'hésitez pas à demander plus de détails !