begin process at 2012 02 12 07:08:41
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > TOURS DE HANOI !

TOURS DE HANOI !


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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 :4 215

Auteur : AmK

Ecrire un message privé
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 !


 Sources du même auteur

Source avec Zip Source avec une capture LIBRAIRIE DE TRAITEMENT DU SIGNAL
Source avec Zip SNAKE GRAPHIQUE ( 1/2 JOUEURS ET IA)
Source avec Zip BLACKJAK AVEC ALLEGRO !!!
Source avec Zip DEMO AVEC ALLEGRO !(HERVÉ AND DADY)
Source avec Zip Source avec une capture SNAKE EN MODE TEXTE !(LAHNACHE)

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

Commentaires et avis

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.

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.

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;
        
    }

Commentaire de manta7 le 29/06/2003 13:47:47

Merci pour ces explications.

Commentaire de badrivix le 27/11/2006 17:34:14

Et si on veut la methode itterative?

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,217 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales