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 :

Tour de Hanoï : problème


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Tour de Hanoï : problème
    Je fais un petit programme de la tour de hanoï comportant trois tiges et les nombres 1,2,3 sur la première, mais je n'arrive pas à faire afficher les modifications sur la 2e tige pour une raison que je ne comprend pas vraiment. Je suis débutant en récursivité, alors j'aurais besoin un peu d'aide.

    Voici mon code sous VS2008 :
    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
     
    #include <iostream>
    #include <conio.h>
    #include <iomanip>
    #include <string>
     
    using namespace std; 
     
     
     
    int NbElem = 3; 
     
    void Hanoi(int Matr[3][3], int NbElem, int Col1, int Col2, int Col3);
    void Deplacement(int Matr[3][3], int Col1, int Col3);
    void Afficher(int Matr[3][3]);
     
    void main(void) {
    	int Col1 = 0;
    	int Col2 = 1;
    	int Col3 = 2;
     
    	int Matr[3][3] = {{1,0,0},{2,0,0},{3,0,0}};
     
     
    	cout << "Nombre d'anneaux ? : 3" << endl << endl << endl << endl << endl;
     
    	cout << left << setw(8) << "1" << left << setw(8) << "." << left << setw(8) << "." << endl;
    	cout << left << setw(8) << "2" << left << setw(8) << "." << left << setw(8) << "." << endl;
    	cout << left << setw(8) << "3" << left << setw(8) << "." << left << setw(8) << "." << endl;
    	cout << "____________________" << endl << endl << endl;
     
    	Hanoi(Matr, NbElem, Col1, Col2, Col3);
     
    	_getch();
     
     
     
    }
     
    void Hanoi(int Matr[3][3], int NbElem, int Col1, int Col2, int Col3)  {
    	if(NbElem == 0) {
    		; // condition d'arrêt
    	}
    	else {
    		Hanoi(Matr, NbElem-1,Col1, Col2, Col3);
    		Deplacement(Matr, Col1, Col3);
    		Hanoi(Matr,NbElem-1, Col2, Col1, Col3);
    	}
    }
     
    void Deplacement(int Matr[3][3], int Col1, int Col3) {
    	int tempo = 0;
    	int i = 0;
     
    	while(Matr[i][Col1]==0) {
    		i++;
    	}
     
    	if(i<3) {
    	tempo = Matr[i][Col1];
    	Matr[i][Col1] = 0;
    	}
     
    	i = NbElem-1;
     
    	while(Matr[i][Col3] != 0) {
    		i--;
    	}
     
    	if(i>=0)  {
    	Matr[i][Col3] = tempo;
    	}
     
    	Afficher(Matr);
     
    	_getch();
    }
     
    void Afficher(int Matr[3][3]) {
    	cout << left << setw(8) << Matr[0][0] << left << setw(8) << Matr[0][1] << left << setw(8) << Matr[0][2] << endl;
    	cout << left << setw(8) << Matr[1][0] << left << setw(8) << Matr[1][1] << left << setw(8) << Matr[1][2] << endl;
    	cout << left << setw(8) << Matr[2][0] << left << setw(8) << Matr[2][1] << left << setw(8) << Matr[2][2] << endl;
    	cout << "____________________" << endl << endl;
    }
    Pourriez-vous m'aider à trouver le problème svp?

    Merci beaucoup.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 200
    Points : 12 354
    Points
    12 354
    Par défaut
    Le problème n'est pas d'en l'affichage mais dans l'algorithme.

    FAUX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Hanoi(int Matr[3][3], int NbElem, int Col1, int Col2, int Col3)  {
    	if(NbElem == 0) {
    		; // condition d'arrêt
    	}
    	else {
    		Hanoi(Matr, NbElem-1,Col1, Col2, Col3);
    		Deplacement(Matr, Col1, Col3);
    		Hanoi(Matr,NbElem-1, Col2, Col1, Col3);
    	}
    }
    CORRECTION:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Hanoi(int Matr[3][3], int NbElem, int Col1, int Col2, int Col3)  {
    	if(NbElem == 0) {
    		; // condition d'arrêt
    	}
    	else {
    		Hanoi(Matr, NbElem-1,Col1, Col3, Col2);
    		Deplacement(Matr, Col1, Col3);
    		Hanoi(Matr,NbElem-1, Col2, Col1, Col3);
    	}
    }
    Utilisez des noms de variable explicite, et vous verrez tout de suite l'erreur, si vous avez compris le principe de résolution bien sûr.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Si je ne m'abuse, tu n'écris jamais de valeur dans la seconde colonne (ni dans la première d'ailleurs).
    Deplacement n'écrit que dans col3 pas dans col1. Or le deux seuls indices qui changent sont col1/col2, c'est à dire des indices de lecture et pas de destination.

    Autre remarque, excepté l'utilisation de std::cout, ce code n'est que du C et pas du C++. L'objectif est d'apprendre le C ou le C++ ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Oui, le but du cours est bel et bien d'apprendre le c++. C'est un cours de structure de données au niveau collégial (au Québec).

Discussions similaires

  1. Tours de Hanoï
    Par bentarito dans le forum Débuter
    Réponses: 6
    Dernier message: 03/01/2011, 00h43
  2. Encore cette fameuse tour de Babel - problème d'accents
    Par mmazerolle dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 06/10/2010, 18h27
  3. Tour de hanoï
    Par overside dans le forum Débuter
    Réponses: 3
    Dernier message: 26/09/2010, 16h51
  4. [MIDlet Pascal] Jeu des Tours de Hanoï
    Par krachik dans le forum Contribuez
    Réponses: 1
    Dernier message: 27/05/2009, 21h04
  5. Variante des tours de Hanoï (disques pairs, impairs)
    Par loader dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 23/09/2008, 10h29

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