Algorithme de la Tour de Hanoï : Python, code C++

Qu'est-ce que la Tour de Hanoï ?

La Tour de Hanoï est un puzzle mathématique composé de trois tiges et de nombreux disques superposés. Elle est également connue sous le nom de Tour de Brahma ou Tour Lucas, comme l'a présenté le mathématicien français Edouard Lucas en 1883. Ce puzzle est basé sur des légendes sur le déplacement de disques d'or entre trois tiges.

Ce puzzle comporte trois tiges et un nombre variable de disques empilés. Ces cannes sont conçues comme des tours cycliques. Ainsi, les disques de plus grand diamètre sont empilés en bas et les disques plus petits sont empilés en haut.

Dans un premier temps, on nous donne trois piquets ou tiges. Et l'un d'eux (A, illustré dans l'exemple) a tous les disques empilés. Notre objectif est de déplacer une pile entière de disques d'une tige (A) à une autre (C) en obéissant à certaines règles spécifiques.

Voici la configuration initiale du puzzle-

Problème de la tour de Hanoï
Problème de la tour de Hanoï

Et c'est le but final-

Tour de Hanoi

Règles de la Tour de Hanoï

Voici quelques règles essentielles pour la Tour de Hanoï :

  • L'état initial de ce puzzle, tous les disques seront empilés dans la première tige.
  • L'état final est que tous les disques de la tige un seront empilés sur la tige deux ou sur la tige trois.
  • Nous pouvons déplacer un disque d’une tige à une autre à tout moment.
  • Nous ne pouvons déplacer que le disque supérieur de la tige.
  • Un disque ne peut pas être placé sur un autre disque, plus petit.

La légende originale parlait du déplacement de 64 disques. Les prêtres pouvaient déplacer un disque à la fois selon les règles. Selon la légende, il y avait une prophétie selon laquelle le monde prendrait fin s'ils parvenaient à accomplir l'acte. Au moment venuplexDans la section Ville, nous montrerons qu'un réglage de la Tour de Hanoï avec n disques coûterait 2 ^ n – 1 coup.

Ainsi, si les prêtres pouvaient avoir besoin d'une seconde pour déplacer les disques, le temps total dont ils auraient besoin pour résoudre le puzzle serait de 1^2 – 64 seconde ou 1 584,942,417,356 26 7 ans, 15 jours, heures et secondes.

Algorithme pour la Tour de Hanoi

Une manière générale de résoudre la Tour de Hanoï est un algorithme récursif. Tout d’abord, nous devons choisir deux tiges ou piquets comme source et destination, et le piquet de rechange serait un auxiliaire ou une aide.

Voici les étapes pour résoudre le puzzle de la Tour de Hanoï :

  • Déplacez les n-1 premiers disques du rattachement source vers le rattachement auxiliaire.
  • Ensuite, déplacez le nième disque du rattachement source vers le rattachement de destination.
  • Enfin, déplacez les n-1 disques restants de la cheville auxiliaire vers la cheville de destination.

Notes: Si nous avons un seul disque, nous pouvons le déplacer directement de la source à la destination.

Comment résoudre le puzzle de la Tour de Hanoi

Illustrons l'algorithme pour trois disques et considérons la cheville A comme source, la cheville B comme assistant et la cheville C comme destination.

Étape 1) Initialement, tous les disques seront empilés sur le plot A.

Résoudre le puzzle de la Tour de Hanoï

À ce stade:

Source = cheville A
Destination = cheville C
Aide = cheville B

Maintenant, nous devons déplacer les n-1 premiers disques de la source vers l'assistant.

Remarque: Bien que nous ne puissions déplacer qu'un seul disque à la fois, cela fait passer notre problème d'un problème à 3 disques à un problème à 2 disques, ce qui est un appel récursif.

Étape 2) Comme nous appelons un appel récursif depuis le piquet A et que la destination est le piquet B, nous utiliserons le piquet C comme assistant.

Notez que nous sommes à nouveau à la première étape pour le même problème de tour de Hanoi pour deux disques.

Nous devons maintenant déplacer n-1 ou un disque de la source vers l'assistant, en déplaçant le plus petit disque de la cheville A à la cheville C.

Résoudre le puzzle de la Tour de Hanoï

À ce stade:

Source = cheville A
Destination = piquet B
Aide = cheville C

Étape 3) Ensuite, selon notre algorithme, le nième ou le deuxième disque nécessaire doit être transféré vers la destination ou le chevillement B.

Résoudre le puzzle de la Tour de Hanoï

À ce stade:

Source = cheville A
Destination = piquet B
Aide = cheville C

Étape 4) Maintenant, nous allons déplacer les n-1 disques ou le disque un de l'assistant ou du chevillement C vers la destination ou le chevillement B selon la troisième étape de notre algorithme.

Résoudre le puzzle de la Tour de Hanoï

À ce stade:

Source = cheville A
Destination = piquet B
Aide = cheville C

Étape 5) Après avoir terminé l'appel récursif, nous reviendrons à notre paramètre précédent lors de la première étape de l'algorithme.

Étape 6) Maintenant, dans la deuxième étape, nous allons déplacer notre source vers notre destination, qui déplace le disque 3 vers le plot C depuis le plot A.

À ce stade:

Source = cheville A
Destination = piquet C
Aide = cheville B

Étape 7) Maintenant nous pouvons voir ça

Résoudre le puzzle de la Tour de Hanoï

d consiste à déplacer les disques restants de l'assistant (peg B) vers la destination (peg C). Nous utiliserons la source initiale ou le rattachement A comme aide dans ce cas.

Étape 8) Comme on ne peut pas déplacer deux disques simultanémentneohabituellement, nous appellerons un appel récursif pour le disque 1. Selon la dernière étape et notre algorithme, une destination dans cette étape est le piquet A.

Résoudre le puzzle de la Tour de Hanoï

À ce stade:

Source = cheville B
Destination = piquet A
Aide = cheville C

Étape 9) Notre appel récursif est maintenant terminé. Ensuite, nous déplaçons le disque 2 de sa source vers sa destination.

Résoudre le puzzle de la Tour de Hanoï

À ce stade:

Source = cheville B
Destination = piquet C
Aide = cheville A

Étape 10) Ensuite, nous déplaçons notre n-1 ou disque 1 restant de l'assistant vers la destination.

Résoudre le puzzle de la Tour de Hanoï

À ce stade:

Source = cheville A
Destination = piquet C
Aide = cheville B

Pseudo-code de la tour de Hanoï

START
Procedure Tower_Of_Hanoi(disk, source, dest, helper)
  		IF disk == 1, THEN
      			move disk from source to dest             
   		ELSE
     			Tower_Of_Hanoi (disk - 1, source, helper, dest)     
      			move disk from source to dest          
      			Tower_Of_Hanoi (disk - 1, helper, dest, source)     
   		END IF   
END Procedure

Code de programme en C++

#include <bits/stdc++.h>
using namespace std;
void tower_of_hanoi(int num, string source, string dest, string helper) {
  if (num == 1) {
    cout << " Move disk 1 from tower " << source << " to tower " << dest << endl;
    return;
  }
  tower_of_hanoi(num - 1, source, helper, dest);
  cout << " Move disk " << num << " from tower " << source << " to tower " << dest << endl;
  tower_of_hanoi(num - 1, helper, dest, source);
}
int main() {
  int num;
  cin >> num;
  printf("The sequence of moves :\n");
  tower_of_hanoi(num, "I", "III", "II");
  return 0;
}

Sortie

3
The sequence of moves :
Move disk 1 from tower I to tower III
Move disk 2 from tower I to tower II
Move disk 1 from tower III to tower II
Move disk 3 from tower I to tower III
Move disk 1 from tower II to tower I
Move disk 2 from tower II to tower III
Move disk 1 from tower I to tower III

Code de programme en Python

def tower_of_hanoi(n, source, destination, helper):
	if n==1:
		print ("Move disk 1 from peg", source," to peg", destination)
		return
	tower_of_hanoi(n-1, source, helper, destination)
	print ("Move disk",n," from peg", source," to peg", destination)
	tower_of_hanoi(n-1, helper, destination, source)		
# n = number of disks
n = 3
tower_of_hanoi(n,' A','B','C')

Sortie :

Move disk 1 from peg A to peg B
Move disk 2 from peg A to peg C
Move disk 1 from peg B to peg C
Move disk 3 from peg A to peg B
Move disk 1 from peg C to peg A
Move disk 2 from peg C to peg B
Move disk 1 from peg A to peg B

Avecplexville de la Tour de Hanoï

Voici le Time and Space Complexville de la Tour de Hanoï :

1) Heure à venirplexité:

Si nous revenons sur notre algorithme, nous pouvons voir que nous introduisons deux fois un appel récursif pour (n-1) disques. Ces appels récursifs pour (n-1) disques peuvent être décomposés en d'autres ((n-1)-1) et ainsi de suite jusqu'à ce que nous n'ayons qu'un seul disque à déplacer.

Pour trois disques-

  • Le disque 3 appelle deux fois une fonction récursive pour le disque deux.
  • Le disque 2 appelle deux fois une fonction récursive pour le disque un.
  • Le disque 1 peut se déplacer dans un temps constant et un temps pour résoudre trois disques.

= 2*(Temps de résolution pour deux disques) + Temps constant pour déplacer le disque 3

= 2*(2*temps pour résoudre un disque + temps constant pour déplacer le disque 2) + temps constant pour déplacer le disque 3

= (2*2) (temps constant pour déplacer le disque 1) + 2*temps constant pour déplacer le disque 2 + temps constant pour déplacer le disque 3

Pour n disques, cela peut s’écrire –

(2n-1 * temps constant pour déplacer le disque 1 + 2n-2 * temps constant pour déplacer le disque 2 +….

Cette progression géométrique se traduira par O(2n-1) ou O (2n), ce qui est exponentiel.

2) Espace complexity

L'espace complexLa ville de la Tour de Hanoï est 0(n). C'est parce que nous devons stocker la séquence des plaques. Lorsque nous utilisons la récursivité, nous utilisons la pile. Et la taille maximale de la pile peut être « n ». C'est pourquoi l'espace complexity devient O(n).