IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Code des tours de hanoi


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 38
    Points
    38
    Par défaut Code des tours de hanoi
    Bonjour ,
    SVP y a il quelqu'un pour m'expliquer étape par étape ce code de hanoi, je le trouve vraiment pas mal compliqué.. Si non y a il une autre méthode pour résoudre les tours de hanoi sans avoir recours aux tableau multidimensionnel et aux classes .
    MERCI D'AVANCE , Merci du fond de mon coeur!!!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    #include <iostream>
    using namespace std;
     
    const unsigned int N = 4; // la taille de la tour de depart
     
    // un disque sera represente simplement par sa taille (rayon)
    typedef unsigned int Disque;
    // 0 signifiant pas de disque
    const Disque PAS_DE_DISQUE(0);
     
    typedef Disque Pilier[N]; // un pilier est une pile d'au plus N disques
    typedef Pilier Jeu[3]; // le jeu est constitue de 3 piliers
     
    // les fonctions
    void affiche(char c, unsigned int n = 1);
    void affiche(Disque d);
    void affiche(Jeu jeu);;
    void init(Jeu& jeu); /* Note: le passage par reference est ici
                          * facultatif vu que Jeu est un tableau.  Mais je
                          * prefere marquer clairement par ce passage par
                          * reference que l'argument jeu est modifie par
                          * cette fonction */
     
    unsigned int sommet(Pilier p);
    void deplace(Pilier& origine, Pilier& destination); // meme remarque
    unsigned int autre(unsigned int p1, unsigned int p2);
    void hanoi(unsigned int n, unsigned int origine,
               unsigned int destination, Jeu jeu);
     
    // --------------------------------------------------------------------
    int main()
    {
      Jeu monjeu;
     
      init(monjeu);
      affiche(monjeu);
      hanoi(N, 0, 2, monjeu);
     
      return 0;
    }
     
    // --------------------------------------------------------------------
    void init(Jeu& jeu)
    {
      for (unsigned int i(0); i < N; ++i) {
        jeu[0][i] = i+1;
        jeu[1][i] = PAS_DE_DISQUE;
        jeu[2][i] = PAS_DE_DISQUE;
      }
    }
     
    // --------------------------------------------------------------------
    void affiche(char c, unsigned int n)
    {
      for (unsigned int i(0); i < n; ++i) cout << c;
    }
     
    // --------------------------------------------------------------------
    void affiche(Disque d)
    {
      if (d == PAS_DE_DISQUE) {
        affiche(' ', N-1);
        cout << '|';
        affiche(' ', N);
      }
      else {
        affiche(' ', N-d);
        affiche('-', 2*d-1);
        affiche(' ', N-d+1);
      }
    }
     
    // --------------------------------------------------------------------
    void affiche(Jeu jeu)
    {
      for (unsigned int i(0); i < N; ++i) {
        affiche(jeu[0][i]);
        affiche(jeu[1][i]);
        affiche(jeu[2][i]);
        cout << endl;
      }
      // le socle
      affiche('#', 6*N-1); // 3*(2*N-1)+2 = 6*N-1
      cout << endl << endl;
    }
     
    // --------------------------------------------------------------------
    unsigned int sommet(Pilier p)
    {
      unsigned int top;
      for (top = 0; (top < N) && (p[top] == PAS_DE_DISQUE); ++top);
      return top;
    }
     
    // --------------------------------------------------------------------
    void deplace(Pilier& origine, Pilier& destination)
    {
      unsigned int top1(sommet(origine));
      if (top1 < N) { // si la tour d'origine existe bien
     
        unsigned int top2(sommet(destination));
        if ((top2 < N) && (destination[top2] < origine[top1])) {
          /* on essaye de mettre un disque plus gros (origine[top1])
           * sur un disque plus petit (destination[top2]) : ce n'est pas
           * un deplacement autorise !
           */
          cerr << "ERREUR : on ne peut pas deplacer une disque de taille "
               << origine[top1] << " sur un disque de taille "
               << destination[top2] << " !" << endl;
          return;
        }
     
        // effectue le mouvement
        destination[top2-1] = origine[top1];
        origine[top1] = PAS_DE_DISQUE;
      }
    }
     
    // --------------------------------------------------------------------
    unsigned int autre(unsigned int p1, unsigned int p2)
    {
      return 3 - p1 -p2;
    }
     
    // --------------------------------------------------------------------
    void hanoi(unsigned int n, unsigned int origine,
               unsigned int destination, Jeu jeu)
    {
      if (n != 0) {
        unsigned int auxiliaire(autre(origine, destination));
        hanoi(n-1, origine, auxiliaire, jeu);
        deplace(jeu[origine], jeu[destination]);
        affiche(jeu);
        hanoi(n-1, auxiliaire, destination, jeu);
      }
    }

  2. #2
    Membre expérimenté
    Avatar de Senji
    Inscrit en
    Juillet 2008
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 144
    Points : 1 391
    Points
    1 391
    Par défaut
    salut,

    il serait mieux de comprendre l'algorithme des tours de hanoi que de comprendre ce code. car Il existe un algorithme récursif très classique pour résoudre ce problème. Imprégnez vous du principe du jeu, vérifiez que vous comprenez l'algorithme récursif, et réfléchissez à une modélisation, ainsi vous pourrez le coder tout seul et dans n'importe quel langage

    bye
    Merci de lire les réponses jusqu'à compréhension!!!
    RTFM

    Vive les bananes
    ______________

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Points : 168
    Points
    168
    Par défaut
    Bonjour

    Que trouves tu compliqué dans ce code (pour savoir quoi t'expliquer dans le code proposé) ?

    A la question :
    Si non y a il une autre méthode pour résoudre les tours de hanoi sans avoir recours aux tableau multidimensionnel et aux classes, la réponses est oui, bien entendu... (Tout est possible, tout est réalisable, c'est le jeu de ... l'informatique).

    Pour commenser, tu peux essayer de mettres des classes conformement a ce que l'auteur utilise déjà (Disque, Pilier, Jeu), avec leurs méthodes.
    Si tu veux être (plus) c++, tu peux utiliser std::vector à la place des tableaux.
    Fais un essais, et je pourrais t'aider
    --
    Jérémie
    Jérémie

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par crazyvirus Voir le message
    Bonjour ,
    SVP y a il quelqu'un pour m'expliquer étape par étape ce code de hanoi, je le trouve vraiment pas mal compliqué..
    Hello,

    Toute l'âme du jeu réside dans l'unique fonction « hanoï », soit dans les dix dernières lignes de ton code. Le reste n'est là que pour gérer l'affichage du jeu à l'écran.

    Il y a deux manières de résoudre le jeu, une méthode récursive et une méthode non récursive. Si tu abordes ce jeu dans le cadre d'un cours, il y a fort à parier que c'est pour mettre en évidence l'approche récursive.

    Si non y a il une autre méthode pour résoudre les tours de hanoi sans avoir recours aux tableau multidimensionnel et aux classes .
    Je n'ai pas vu de tableau multi-dimensionnel dans ton code. Tu n'es pas obligé d'utiliser non plus la programmation orientée objet. Ce jeu a été implémenté très souvent en C, et certains ici-même essaient même de le coder en assembleur MIPS. C'est un problème purement algorithmique.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    Merci a tous ! Je vais essayer de coder un et vous donner de mes nouvelles

    Citation Envoyé par Obsidian Voir le message
    Je n'ai pas vu de tableau multi-dimensionnel dans ton code. Tu n'es pas obligé d'utiliser non plus la programmation orientée objet. Ce jeu a été implémenté très souvent en C, et certains ici-même essaient même de le coder en assembleur MIPS. C'est un problème purement algorithmique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     jeu[0][i] = i+1;
        jeu[1][i] = PAS_DE_DISQUE;
        jeu[2][i] = PAS_DE_DISQUE;

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par crazyvirus Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     jeu[0][i] = i+1;
        jeu[1][i] = PAS_DE_DISQUE;
        jeu[2][i] = PAS_DE_DISQUE;
    Effectivement, j'ai lu ton code un peu trop vite ...

  7. #7
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    Enfin , voila mon code !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include<iostream>
    using namespace std;
    void hanoi (int,char,char,char);
    int main()
    {
        int n;
        cout<<"Entrer le nombre de disques : "<<endl;
        cin>>n;
        hanoi(n,'A','B','C');
        cout<<endl;
        system("pause");
        return 0;
    }
     
    void  hanoi( int ndisque,char source,char intermediaire,char destination)
    {
          if ( ndisque == 1)
          cout<<"Deplacer le disque de la tour"<<" "<<source<<" "<<"a la tour"<<" "<<destination<<endl;
          else
          {
              hanoi ( ndisque - 1 , source , destination , intermediaire);
              hanoi( 1 , source , intermediaire , destination );
              hanoi ( ndisque - 1 ,intermediaire , source , destination );
          }
    }

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Tout de suite, c'est nettement plus simple, tu ne trouves pas ? :-)

    À bientôt.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    Oui biensur !! mais aprés un bon temps passé XD!!

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Juste une remarque concernant la fonction hanoi()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void  hanoi( int ndisque,char source,char intermediaire,char destination)
    Comme cela se joue toujours avec 3 tours, le paramètre "intermédiaire" n'est pas nécessaire car il peut se déduire de "source" et "destination". Cela fait un risque d'incohérence en moins et aussi un paramètre de moins à passer.

    Mon avis à 0,01€
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Beo,
    Citation Envoyé par ram-0000 Voir le message
    Juste une remarque concernant la fonction hanoi()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void  hanoi( int ndisque,char source,char intermediaire,char destination)
    Comme cela se joue toujours avec 3 tours, le paramètre "intermédiaire" n'est pas nécessaire car il peut se déduire de "source" et "destination". Cela fait un risque d'incohérence en moins et aussi un paramètre de moins à passer.

    Mon avis à 0,01€
    Mais il rend le code plus compréhensible pour un lecteur.
    Si les cons volaient, il ferait nuit à midi.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2008
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par droggo Voir le message
    Beo,

    Mais il rend le code plus compréhensible pour un lecteur.
    Haha , effectivement !
    Merci ram!

Discussions similaires

  1. [MIDlet Pascal] Jeu des Tours de Hanoi
    Par krachik dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 03/04/2013, 11h51
  2. Affichage des Tours de Hanoi
    Par Marin Échoué dans le forum C++
    Réponses: 1
    Dernier message: 20/09/2012, 06h43
  3. Réponses: 10
    Dernier message: 06/10/2005, 22h25
  4. Optimisation du code des ordres SQL
    Par Titouf dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/08/2005, 22h08
  5. Report6i:Code des couleurs
    Par BILLYPATOU dans le forum Oracle
    Réponses: 3
    Dernier message: 29/06/2005, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo