Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TOURS DE HANOI !


Information sur la source

Catégorie :Maths & Algorithmes Niveau : Débutant Date de création : 27/06/2003 Date de mise à jour : 27/06/2003 13:38:43 Vu : 3 173

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

Description

Pour ceux qui ne connaissent pas encore ce casse tete :
  
IL s'agit de déplacer un certain nombre de disques d'un piquet à un autre en utilisant un troisième piquet comme lieu de transfert temporaire, mais il ya 2 contraintes : on ne peut déplacer qu'un seul disque à la fois  , et un disque de diamètre superieur ne peut se retrouver au dessus d'un disque de diamètre inférieur , la soluce simple pour résourdre ce problèmee st d'utiliser une fonction récursive parceque sinon si on choisit la methode itérative ça devient vite le bordel !
 

Source

  • // Auteur : Amokrane Chentir
  • // Programme de résolution du problème des TOURS DE HANOI !
  • // Algo utilisé : fonction recursive
  • #include <iostream>
  • using std::cout;
  • using std::cin;
  • using std::endl;
  • void hanoi(int ,int ,int ,int);
  • int main()
  • {
  • int a,b,c,d,fin;
  • cout<<"Programme de r\202solution du probl\212me des tours de hanoi !"<<endl;
  • cout<<endl;
  • cout<<"Combien y'a t'ils de disques \205 d\202placer ?"<<endl;
  • cin>>a;
  • cout<<"Il ya 3 piquets : 1-2-3 !"<<endl;
  • cout<<"Quel est le piquet ou les disques sont initialement plac\202s ?"<<endl;
  • cin>>b;
  • cout<<"Quel est le piquet ou cette pile de disque va \202tre d\202plac\202 ?"<<endl;
  • cin>>c;
  • cout<<"Quel est le piquet servant de lieu de transfert temporaire ?"<<endl;
  • cin>>d;
  • hanoi(a,b,c,d);
  • cout<<endl;
  • cout<<"Tapez une touche pour sortir !"<<endl; // Au lieu de mettre un Sleep
  • cin>>fin; // Une manière élegante de sortir d'un programme
  • return 0;
  • }
  • void hanoi(int nombre,int depart,int arrive,int transfert)
  • {
  • if (nombre==1) // Le problème de base !
  • {
  • cout<<depart<< " -> " <<arrive<<endl;
  • }
  • else // Tout le truc est la !!!
  • {
  • hanoi(nombre - 1,depart,transfert,arrive);
  • cout<<depart<<' '<<"->"<<' '<<arrive<<endl;
  • hanoi(nombre - 1,transfert,arrive,depart);
  • } // La fonction recursive quoi !
  • }
// Auteur : Amokrane Chentir
// Programme de résolution du problème des TOURS DE HANOI !
// Algo utilisé : fonction recursive 


#include <iostream>

using std::cout;
using std::cin;
using std::endl;

void hanoi(int ,int ,int ,int);

int main()
{
	int a,b,c,d,fin;
        

	cout<<"Programme de r\202solution du probl\212me des tours de hanoi !"<<endl;
    cout<<endl;
	cout<<"Combien y'a t'ils de disques \205 d\202placer ?"<<endl;
	cin>>a;

    cout<<"Il ya 3 piquets : 1-2-3 !"<<endl;

	cout<<"Quel est le piquet ou les disques sont initialement plac\202s ?"<<endl;
	cin>>b;

	cout<<"Quel est le piquet ou cette pile de disque va \202tre d\202plac\202 ?"<<endl;
	cin>>c;

	cout<<"Quel est le piquet servant de lieu de transfert temporaire ?"<<endl;
	cin>>d;

	hanoi(a,b,c,d);
cout<<endl;     
cout<<"Tapez une touche pour sortir !"<<endl; // Au lieu de mettre un Sleep
cin>>fin;                                     // Une manière élegante de sortir d'un programme
	return 0;
}

void hanoi(int nombre,int depart,int arrive,int transfert)
{
	if  (nombre==1)  // Le problème de base !  
	{
     	cout<<depart<< " -> " <<arrive<<endl;
		
	}

    else     // Tout le truc est la !!!
	{
		hanoi(nombre - 1,depart,transfert,arrive);
        cout<<depart<<' '<<"->"<<' '<<arrive<<endl;
		hanoi(nombre - 1,transfert,arrive,depart);

	}  // La fonction recursive quoi !

}

Conclusion

A partir d'un certain nombre de disques , 20 par exemple il sera impossible à l'ordinateur de résoudre le problème !
Hmmm , alors imaginez un peu les pretres de l'extrême orient qui tentent de déplacer 64 disques !!!
Il leurs faudrait quoi ...  euh quelques millions d'années ... et encore comme ça et c'est pas gagné pour eux !
 

Commentaires et avis

signaler à un administrateur
Commentaire de manta7 le 28/06/2003 11:08:36

Salut Amk, tres bien ta source mais il y a un truc que je ne comprends pas c'est la fonction recursive, pourrait tu m'expliquer stp.

signaler à un administrateur
Commentaire de aardman le 28/06/2003 16:34:21

Salut,
Une fonction recursive c'est une fonction qui s'appelle elle meme lors de sa déclaration (dans ce programe, c'est hanoi qui est recursive).
Au debut, on appelle la fonction avec le premier paramettre egal a "nombre".
Dans la fonction, on rapelle cette meme fonction avec nombre-1, qui elle meme va se rapeller avec nombre-1 (donc ca fera nombre-2) et ainsi de suite...
Par exemple, pour 20 disques, la fonction s'appellera 20 fois.

signaler à un administrateur
Commentaire de AmK le 28/06/2003 18:31:49

le but étant d'arriver à l'etat de base qui est :

if  (nombre==1) // Le problème de base !    
    {
        cout&lt;&lt;depart&lt;&lt; " -&gt; " &lt;&lt;arrive&lt;&lt;endl;
        
    }

signaler à un administrateur
Commentaire de manta7 le 29/06/2003 13:47:47

Merci pour ces explications.

signaler à un administrateur
Commentaire de badrivix le 27/11/2006 17:34:14

Et si on veut la methode itterative?

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.