Algo C++

hano -  
KX Messages postés 19031 Statut Modérateur -
Bonjour, pouvez m'expliquer le code C++ suivant portant sur le jeu des tours de hanoï, merci à vous :

#include <stdio.h>
#include <time.h> // time()
// déplacer n disques du socle depart vers le socle but
// en utilisant le socle intermédiaire.
void deplacer (int n, char depart, char but, char intermediaire)

{

if (n > 0)
{
printf ("Deplace un disque de la tige %c --> %c\n", depart, but);
deplacer (n-1, depart, intermediaire, but);
deplacer (n-1, intermediaire, but, depart);
}

}

int main ()
{
int n;

printf ("Nombre de disques a deplacer ? ");

scanf ("%d", &n);
//time_t topDebut; time (&topDebut);
deplacer (n, 'A', 'B', 'C');
//time_t topFin; time (&topFin);
//printf ("de %d à %d = %d\n", topDebut, topFin, topFin - topDebut);
}

5 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Il est faux cet algorithme... Regarde les trois premières étapes pour n=3 :

    A -> B // petite pièce sur tige vide
    A -> C // moyenne pièce sur tige vide
    A -> B // grande pièce sur la petite pièce !

    Tu te retrouves à mettre la plus grande pièce par dessus la plus petite...
    Or tu dois toujours avoir les petites pièces au dessus des grandes !
    0
  2. hano
     
    Salut,

    Heu.. oui je me suis trompé en faisant des modif...pour voir ce que ça donne, voici le vrai code :

    /* hanoi.cpp tours de Hanoi
    exemple de programme avec deux appels récursifs */
    #include <stdio.h>
    #include <time.h> // time()
    // déplacer n disques du socle depart vers le socle but
    // en utilisant le socle intermédiaire.
    void deplacer (int n, char depart, char but, char intermediaire) {
    if (n > 0) {
    deplacer (n-1, depart, intermediaire, but);
    printf ("Déplacer un disque de %c --> %c\n", depart, but);
    deplacer (n-1, intermediaire, but, depart);
    }
    }
    void main () {
    printf ("Nombre de disques à déplacer ? ");
    int n; scanf ("%d", &n);
    //time_t topDebut; time (&topDebut);
    deplacer (n, 'A', 'B', 'C');
    //time_t topFin; time (&topFin);
    //printf ("de %d à %d = %d\n", topDebut, topFin, topFin - topDebut);
    }
    


    J'comprends pas trop..

    merci
    0
  3. KX Messages postés 19031 Statut Modérateur 3 020
     
    Je pense que tu trouveras toutes les explications sur Wikipedia : Tour de Hanoï
    0
  4. hano
     
    Merci, je comprends le principe mais certaines partie de code c++ me paraissent fliou comme :

    deplacer (n-1, depart, intermediaire, but); c'est l'appel de la fonction void ? c'est bien ça ?

    deplacer (n, 'A', 'B', 'C'); Sorte d'ou les A, B, C, il n'y a pas de variable comme pour n...

    voilà si tu pouvais m'expliquer, pour en apprendre plus sur le langage C++
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. KX Messages postés 19031 Statut Modérateur 3 020
     
    Peut-être que tu comprendras mieux avec un affichage complet de ce qui se passe :

    #include <stdio.h>
    
    void aff(char w,int n,char c1,char c2,char c3,char* ch="")
    {
    	int i;
    	for (i=0; i<3-n; i++) printf("   ");
    	printf("deplacer(%d,%c,%c,%c) [%c]\t%s\n",n,c1,c2,c3,w,ch);
    }
    
    void deplacer(int n, char depart, char but, char intermediaire)
    {
    	char ch[50];
    	sprintf(ch,"Deplacement %c --> %c",depart,but);
    
    	if (n>0)
    	{
    		aff('x',n,depart,but,intermediaire);
    		deplacer(n-1, depart, intermediaire, but);
    		aff('y',n,depart,but,intermediaire,ch);
    		deplacer(n-1, intermediaire, but, depart);
    		aff('z',n,depart,but,intermediaire);
    	}
    }
    
    int main()
    {
    	deplacer(3,'A','B','C');
    }
    0