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 c : Sélectionner tout - Visualiser dans une fenêtre à part
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 c : Sélectionner tout - Visualiser dans une fenêtre à part
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 c : Sélectionner tout - Visualiser dans une fenêtre à part
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 c : Sélectionner tout - Visualiser dans une fenêtre à part
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 c : Sélectionner tout - Visualiser dans une fenêtre à part
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 !
Partager