Atelier C++ : Résolution récursive des Tours de Hanoï

Telechargé par Antoine M
C.BOUTAMMINE 1
Atelier : Les tours de Hanoï
Objectif
L’objectif de cet exercice est l’implémentation récursive de la résolution du problème des tours de Hanoï.
Vous proposerez un programme en C++ sous forme console permettant de simuler les déplacements des
disques et d’afficher l’état des trois tours à chaque étape.
Contexte
On dispose de 3 tours :
Tour A : contient au départ n disques empilés du plus grand (en bas de la pile) au plus petit (en haut
de la pile).
Tour B : tour auxiliaire vide.
Tour C : tour d’arrivée vide.
But du jeu
Déplacer les n disques de la tour A vers la tour C, en respectant les règles suivantes :
1. On ne peut déplacer qu’un disque à la fois.
2. On ne peut jamais placer un disque plus grand sur un disque plus petit.
Modélisation
Un disque est modélisé par un int : une valeur plus grande = disque plus grand.
Une tour est modélisée par un std::vector<int> trié par ordre décroissant (index 0 = plus grand = bas
de la pile, dernière case = plus petit = sommet).
Remarque : dans cet atelier on accepte exceptionnellement l’utilisation de variables globales tourA, tourB,
tourC afin de garantir un affichage toujours dans l’ordre A–BC, lors des appels récursifs.
Pour certains sous-programmes, le prototype vous a été donné afin de vous guider. Pour d’autres, aucun
prototype n’a été imposé : c’est à vous de proposer la signature la plus adaptée.
Vous êtes vivement encouragés à consulter la documentation de la classe std::vector (méthodes comme
push_back(), back(), pop_back(), empty(), etc.) afin de tirer parti des fonctionnalités offertes et faciliter votre
implémentation.
C.BOUTAMMINE 2
Travail demandé découpage en sous-programmes
Pour suivre le modèle d’atelier (petites étapes testables), implémentez les sous-programmes suivants et
testez-les séparément avant d’intégrer la récursion.
1. Ecrire un sous-programme SaisirVec() qui permet d’initialiser un vecteur d’entier avec n valeurs saisies
par l’utilisateur.
2. Ecrire un sous-programme TrierVec() qui permet de trier un vecteur d’entier par ordre décroissant.
3. Ecrire un sous-programme InitTour() qui permet d’initialiser une tour avec n disques empilés du plus
grand au plus petit.
4. Écrire un sous-programme qui affiche une tour dans un format lisible, et une autre fonction qui affiche
les trois tours dans l’ordre : TourA, TourB puis TourC :
5. Écrire une fonction afficherTour(const std::vector<int>& tour, char nom) qui affiche le
contenu d’une tour sous la forme A: [5 4 3].
6. Écrire une fonction afficherTours() qui affiche les trois tours dans l’ordre A, B, C sous la forme :
Remarque : la fonction afficherTours() ne prend aucun paramètre en entrée car elle doit utiliser les variables globales
tourA, tourB, tourC pour garantir l’ordre d’affichage lors des appels récursifs de la question 8).
7. Écrire un sous-programme deplacerDernierDisque() qui déplace le dernier élément (sommet) d’une tour
de départ vers une tour destination. La fonction doit vérifier que la tour de départ n’est pas vide et que
la règle d’empilement est respectée. Retourner true si déplacement effectué, false sinon
8. Ecrire un sous-programme hanoi() qui permet de déplacer n disque d’une tour de départ A vers une
tour d’arrivée C en utilisant une tour auxiliaire B qui doit respecter les règles suivantes :
On ne peut déplacer qu’un disque à la fois.
On ne peut jamais placer un disque plus grand sur un disque plus petit.
void hanoi(int n, vector<int> &A, vector<int> &B, vector<int> &C)
Indication : Pour déplacer n disques de A vers C en utilisant B
a) Déplacer n-1 disques de A vers B en utilisant C.
b) Déplacer le disque restant (le plus grand) de A vers C.
c) Déplacer n-1 disques de B vers C en utilisant A.
9. Compléter le programme principal ci-dessous pour qu’il :
Initialise TourA avec n=4 disques
Afficher l’état initial des tours avec afficherTours()
Déplace les 4 disques de TourA vers TourC en utilisant TourB comme tour auxiliaire.
Vérifier que le nombre de déplacement est bien égal à 2𝑛− 1.
C.BOUTAMMINE 3
#include <iostream>
#include <vector>
// variables globales pour l'affichage fixe
vector<int> tourA, tourB, tourC;
int main() {
int n = 4;
}
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!