|
Source : Classique (illustration : wikipedia) Le problème des tours de Hanoï est un jeu de réflexion imaginé par le mathématicien français Édouard Lucas, et consistant à déplacer des disques de diamètres différents d'une tour de « départ » à une tour d'« arrivée » en passant par une tour « intermédiaire » et ceci en un minimum de coups, tout en respectant les règles suivantes : - on ne peut déplacer plus d'un disque à la fois,
- on ne peut placer un disque que sur un autre disque plus grand que lui ou sur un emplacement vide.
On suppose que cette dernière règle est également respectée dans la configuration de départ. On se propose de programmer ceci de manière récursive. Vous lisez un entier n correspondant au nombre de disques et vous affichez les coups à faire pour résoudre le problème. Exmple - Entrée : 3
- Sortie :
1 -> 3 1 -> 2 3 -> 2 1 -> 3 2 -> 1 2 -> 3 1 -> 3
Illustration (pour n=4):
Correction : Par Ahmed Fessi La solution de ce problème est assez claire si l’on pense à raisonner de façon récursive. Si l’on suppose que l’on sait déjà déplacer des piles de n − 1 disques, on se rend compte que l’on sait déplacer des piles de n disques.
En Pascal program hanoi; (* déplacement de ’nombre’ élements du piquet ’depart’ vers le piquet ’arrivee’ en utilisant comme pivot le piquet ’intermediaire’ *) procedure mouvement(depart, arrivee, intermediaire: char; nombre: integer); begin if nombre<>0 then begin (* on déplace les (n-1) premiers éléments vers le piquet intermédiaire *) mouvement(depart, intermediaire, arrivee, nombre-1); (* on déplace l’élément du dessous vers le piquet d’arrivée *) writeln(depart, ’ -> ’, arrivee); (* on déplace les (n-1) éléments du piquet intermédiaire vers l’arrivée *) mouvement(intermediaire, arrivee, depart, nombre-1); end; end; (* programme principal de test *) var n:integer; begin readln(n); mouvement(’a’,’b’,’c’,n); end. En C : #include <stdio.h> void deplacePile(int taille, int debut, int fin, int autre) { if (taille == 0) return; deplacePile(taille - 1, debut, autre, fin); printf("%d -> %d\n", debut, fin); deplacePile(taille - 1, autre, fin, debut); }
int main() { int taille; scanf("%d", &taille); deplacePile(taille, 1, 3, 2); return 0; } En PHP function hanoi($nbr, $dep, $fin, $int) { if($nbr > 0) { hanoi($nbr - 1, $dep, $int, $fin); echo "D".$nbr.":".$dep."->".$fin." "; hanoi($nbr - 1, $int, $fin, $dep); } } En Python
def hanoi(n,de,a,par): if n>0: hanoi(n-1,de,par,a) print str(de),"-->",str(a) hanoi(n-1,par,a,de) print """ jeu de hanoi il s'agit de deplacer des disques de la tour 1 vers la tour 2 """ n=input("donner le nombre de disques : ") hanoi(n,1,2,3)
|