Le tour de hanoi
sousourossa
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
pouvez vous m'aider pour mieux comprendre ce petit programme
ce que je n'ai pas compris,est surtout l'utilité des pointeurs car meme si je fais l'execution à la main pour suivre chaque instruction je n'arrive pas à le comprendre meme si j'ai déjà lu des cours concernant ces pointeurs
merci d'avance
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int N, cpt=0;
int **creermatrice(int l, int c)
{ int i,**p;
p = (int **)malloc(sizeof(int *) * l);
for (i=0 ; i<l ; i++)
{ p[i] = (int *)malloc(sizeof(int) * c); }
return(p);
}
int **liremat(int l)
{ int **p;
int i, j;
p=creermatrice(l,3);
for (i=0 ; i<l ; i++)
{ for (j=0 ; j<3 ; j++)
{ if (j) p[i][j] = 0;
else p[i][j] = i+1;
}
}
return p;
}
void ecriremat(int **p, int l)
{ int i, j;
printf("\n\n" );
for (i=0 ; i<l ; i++)
{ for (j=0 ; j<3 ; j++)
{ if (p[i][j] == 0) printf(".\t" );
else printf("%d\t", p[i][j]); }
printf("\n" );
}
printf("-------------------" );
}
void traiter(int **p, int d, int a, int n)
{
int i=0, v;
while ( (i<n) && (p[i][d] == 0) )
i++;
if (i<n) { v = p[i][d];
p[i][d] = 0;
}
i=n-1;
while ( (i>=0) && (p[i][a] != 0) )
i--;
if (i>=0)
p[i][a] = v;
cpt++;
ecriremat(p, N);
}
void hanoi(int **p, int n, int un, int deux, int trois)
{
if (n == 0 ) {;}
else
{ hanoi(p, n-1, un, trois, deux);
traiter(p, un, trois, N);
hanoi(p, n-1, deux, un, trois);
}
}
int main()
{ int **p;
printf("Nombre d anneaux ? : " );
scanf("%d", &N);
p = liremat(N);
printf("\n\n" );
ecriremat(p, N);
hanoi(p, N, 0, 1, 2);
printf("\n\nRealise en %d operations\n\n", cpt);
return 0;
}
pouvez vous m'aider pour mieux comprendre ce petit programme
ce que je n'ai pas compris,est surtout l'utilité des pointeurs car meme si je fais l'execution à la main pour suivre chaque instruction je n'arrive pas à le comprendre meme si j'ai déjà lu des cours concernant ces pointeurs
merci d'avance
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int N, cpt=0;
int **creermatrice(int l, int c)
{ int i,**p;
p = (int **)malloc(sizeof(int *) * l);
for (i=0 ; i<l ; i++)
{ p[i] = (int *)malloc(sizeof(int) * c); }
return(p);
}
int **liremat(int l)
{ int **p;
int i, j;
p=creermatrice(l,3);
for (i=0 ; i<l ; i++)
{ for (j=0 ; j<3 ; j++)
{ if (j) p[i][j] = 0;
else p[i][j] = i+1;
}
}
return p;
}
void ecriremat(int **p, int l)
{ int i, j;
printf("\n\n" );
for (i=0 ; i<l ; i++)
{ for (j=0 ; j<3 ; j++)
{ if (p[i][j] == 0) printf(".\t" );
else printf("%d\t", p[i][j]); }
printf("\n" );
}
printf("-------------------" );
}
void traiter(int **p, int d, int a, int n)
{
int i=0, v;
while ( (i<n) && (p[i][d] == 0) )
i++;
if (i<n) { v = p[i][d];
p[i][d] = 0;
}
i=n-1;
while ( (i>=0) && (p[i][a] != 0) )
i--;
if (i>=0)
p[i][a] = v;
cpt++;
ecriremat(p, N);
}
void hanoi(int **p, int n, int un, int deux, int trois)
{
if (n == 0 ) {;}
else
{ hanoi(p, n-1, un, trois, deux);
traiter(p, un, trois, N);
hanoi(p, n-1, deux, un, trois);
}
}
int main()
{ int **p;
printf("Nombre d anneaux ? : " );
scanf("%d", &N);
p = liremat(N);
printf("\n\n" );
ecriremat(p, N);
hanoi(p, N, 0, 1, 2);
printf("\n\nRealise en %d operations\n\n", cpt);
return 0;
}
A voir également:
- Le tour de hanoi
- Comment réinitialiser une tour d'ordinateur - Guide
- Carte tour de france 2025 - Guide
- Ma tour s'allume mais l'écran reste noir - Guide
- Brancher tour pc sur tv - Guide
- Je fais le tour du monde en restant dans mon coin ✓ - Forum Loisirs / Divertissements
2 réponses
Les pointeurs ne sont quasiment pas utilisés dans ce programme...
Il y a juste la matrice p = int[N][3] qui est allouée dynamiquement car N est entré par l'utilisateur, et qui permet d'afficher le dessin, mais en soit ça ne rentre pas en compte dans le calcul des tours de Hanoï.
Hanoï en lui même peut se réduire à ceci (avec un affichage réduit) :
Il y a juste la matrice p = int[N][3] qui est allouée dynamiquement car N est entré par l'utilisateur, et qui permet d'afficher le dessin, mais en soit ça ne rentre pas en compte dans le calcul des tours de Hanoï.
Hanoï en lui même peut se réduire à ceci (avec un affichage réduit) :
#include <stdio.h> void hanoi(int n, int x=1, int y=2, int z=3) { if (n>0) { hanoi(n-1,x,z,y); printf("%d --> %d\n",x,z); hanoi(n-1,y,x,z); } } int main() { hanoi(3); return 0; }
Je crois que sousourossa essaye juste de s'approprier ce code pour rendre à son prof un exercice sur Hanoï qui ait l'air d'être de lui, or si c'est juste Hanoï qui l'intéresse c'est inutile de lui expliquer les pointeurs car on en a pas besoin dans cet algorithme, son prof s'en chargera bien assez tôt...
Pour la compréhension des tours de Hanoï tu n'as pas besoin de prendre des codes aussi "compliqués" qui t'embrouillent plus qu'autre chose.
Prends un code le plus simple possible (comme le mien), et débogue le pas à pas en t'aidant d'articles comme celui de Wikipédia par exemple.
Prends un code le plus simple possible (comme le mien), et débogue le pas à pas en t'aidant d'articles comme celui de Wikipédia par exemple.
Il y a une différence entre comprendre ce qu'est un pointer et comprendre à quoi ils servent.
Dans ton cas j'imagine que c'est l'argument int **p qui te pose pb.
Ici, int **p est un tableau à 2 dimensions.
un pointer est une adresse mémoire, donc soit l'adresse d'une variable, soit l'adresse d'un tableau (donc une suite de variable qui se suivent).
donc si on met int *p (avec 1 seul *) on a soit une variable de type int à l'adresse *p, soit une suite de variable de type int à l'adresse *p (tableau). dans le cas présent il s'agit d'un tableau.
Hors ici, on a int **p donc p pointe vers une suite d'adresse. chaque adresse pointant à son tour vers une suite de int.
tu te retrouve alors avec un tableau a 2 dimensions... lorsque tu as int *p, tu peux accéder à chaque entrées du tableau en faisant p[X] avec X compris entre 0 et [taille_du_tableau] (attention à ne pas dépasser).
donc avec ton int **p, si tu fais int p[0] tu obtiens le int *p de la premiere ligne, donc en faisant p[0][0] tu obtiens le premier int de la premiere ligne.
je sais pas si c'est super clair... à mon sens dans la compréhension des pointers, le mieux c'est d'experimenter.
D'ailleurs tu fera gaffe, ya une fuite mémoire dans ton prog.