Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3116 connectés 

  FORUM HardWare.fr
  Programmation
  C

  tours d'Hanoi

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Précédente
Auteur Sujet :

tours d'Hanoi

n°581913
Zipo
Ours bipolaire
Posté le 02-12-2003 à 23:25:46  profilanswer
 

Code :
  1. #include <stdio.h>
  2.   #include <stdlib.h>
  3.   #define N 20
  4.  
  5.   typedef struct { int sommet;
  6.                      int tab[N];
  7.                  } pile;
  8.  
  9.   void empiler(int c, pile *p)
  10.   {   (*p).tab[(*p).sommet] = c;
  11.         (*p).sommet ++;
  12.   }
  13.  
  14.   int depiler(pile *p)
  15.   {  (*p).sommet --;
  16.       return (*p).tab[(*p).sommet + 1];
  17.   }
  18.  
  19.  
  20.  
  21.   int hanoi(pile *un, pile *deux, pile *trois, int n)
  22.   { int c;
  23.       if (n == 0 ) return 0;
  24.         else
  25.           { hanoi(un, trois, deux, n-1);
  26.               if ( (*un).sommet > 0){
  27.                            c = depiler(un);
  28.                            empiler(c, trois);
  29.                                     }
  30.               hanoi(deux, un, trois, n-1);
  31.           }
  32.   }
  33.  
  34.  
  35.   int main()
  36.   {  int n, i, d;
  37.        pile *un, *deux, *trois;
  38.     printf("Nombre d anneaux ? : " );
  39.     scanf("%d", &n);
  40.     un = (pile *)malloc(sizeof(int) * (n+1));
  41.     deux = (pile *)malloc(sizeof(int) * (n+1));
  42.     trois = (pile *)malloc(sizeof(int) * (n+1));
  43.    
  44.     d = n;
  45.     printf("\npiquet UN :\n" );
  46.     for(i=0 ; i<n ; i++)
  47.        { (*un).tab[i] = d ;
  48.            (*deux).tab[i] = 0;
  49.            (*trois).tab[i] = 0;
  50.             d--;
  51.            printf("%d\t", (*un).tab[i]);
  52.        }
  53.     (*un).sommet = n-1;
  54.     (*deux).sommet = 0;
  55.     (*trois).sommet = 0;
  56.    
  57.    
  58.     hanoi(un, deux, trois, n);
  59.    
  60.     printf("\nApres le jeu :\n\npiquet UN :\n" );
  61.     for(i=1 ; i<= (*un).sommet ; i++)
  62.        { printf("%d\t", (*un).tab[i]);
  63.        }
  64.     printf("\npiquet DEUX :\n" );
  65.     for(i=1 ; i<= (*deux).sommet ; i++)
  66.        { printf("%d\t", (*deux).tab[i]);
  67.        }
  68.     printf("\npiquet TROIS :\n" );
  69.     for(i=1 ; i<= (*trois).sommet ; i++)
  70.        { printf("%d\t", (*trois).tab[i]);
  71.        }
  72.    
  73.     return 0;
  74.   }


 
Salut j'essaye de faire en C l'algo des tours d'Hanoi je sais pas si vous connaissez, j'suis arrivé à ça (au dessus) mais ca ne marche pas vraiment  
Vous pouvez m'aider un ptit peu ?    
Merkiiii
 


---------------
- mon feed-back
mood
Publicité
Posté le 02-12-2003 à 23:25:46  profilanswer
 

n°581915
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 02-12-2003 à 23:33:01  profilanswer
 

Code :
  1. void empiler(int c, pile *p)
  2.   {   (*p).tab[(*p).sommet] = c;
  3.         (*p).sommet ++;
  4.   }


[:totoz]
p->tab
p->sommet
c'est mieux déjà... pour le reste, j'ai pas lu ton source mais bon, corrige déjà les déréférencements de pointeurs, parce que là c'est n'importe quoi...


Message édité par Harkonnen le 02-12-2003 à 23:33:32

---------------
J'ai un string dans l'array (Paris Hilton)
n°581921
ffluff
Challenge Everything
Posté le 02-12-2003 à 23:40:38  profilanswer
 

comment ca "ca marche pas vraiment " ?
et l'algo de hanoi c'est pas vraiment ca.
l'algo  
debut:
 je prends le premir anneau je le mets sur le piquet 2
 je deplace le reste sur le piquets 3
 je prends l'anneau du piquet 2 et le mets sur le piquet 3
fin


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
n°581922
Zipo
Ours bipolaire
Posté le 02-12-2003 à 23:44:32  profilanswer
 

Harkonnen a écrit :

Code :
  1. void empiler(int c, pile *p)
  2.   {   (*p).tab[(*p).sommet] = c;
  3.         (*p).sommet ++;
  4.   }


[:totoz]
p->tab
p->sommet
c'est mieux déjà... pour le reste, j'ai pas lu ton source mais bon, corrige déjà les déréférencements de pointeurs, parce que là c'est n'importe quoi...


 
Bah c'est pas n'importe quoi, ca marche cette écriture non ?


---------------
- mon feed-back
n°581926
Zipo
Ours bipolaire
Posté le 02-12-2003 à 23:48:53  profilanswer
 

fFluFf a écrit :

comment ca "ca marche pas vraiment " ?
et l'algo de hanoi c'est pas vraiment ca.
l'algo  
debut:
 je prends le premir anneau je le mets sur le piquet 2
 je deplace le reste sur le piquets 3
 je prends l'anneau du piquet 2 et le mets sur le piquet 3
fin


Tu peux réexpliquer plus détaillé stp ?
Moi j'ai ca :
pour déplacer n anneaux du piquet 1 au piquet 3 :
- déplacer n-1 anneaux du piquet 1 au piquet 3
- déplacer l'anneau du piquet 1 au piquet 2
- déplacer n-1 anneaux du piquet 3 au piquet 2
 
mais je comprend pas bien, pour déplacer n-1 anneaux du piquet 1 au 3 (1er tiret) par exemple, je suis obligé de prendre le 1er anneau au sommet du piquet 1, de le mettre sur le 3, puis de prendre le nouvel anneau au sommet du piquet 1 et de le mettre sur le piquet 3, mais là on mettrai un anneau plus gros sur un plus petit donc c pas bon ! non ?
Désolé j'm'embrouille surement mais c pas clair dans mon esprit :p


Message édité par Zipo le 02-12-2003 à 23:49:10

---------------
- mon feed-back
n°581947
jagstang
Pa Capona ಠ_ಠ
Posté le 03-12-2003 à 00:04:36  profilanswer
 

Code :
  1. un = (pile *)malloc(sizeof(int) * (n+1));


 
C'est quoi cette histoire ? pourquoi tu alloues n+1 entiers pour stocker une valeur n ?
 
pis si tu penses à allouer, pense à désallouer aussi...
 

n°581961
Zipo
Ours bipolaire
Posté le 03-12-2003 à 00:20:21  profilanswer
 

JagStang a écrit :

Code :
  1. un = (pile *)malloc(sizeof(int) * (n+1));


 
C'est quoi cette histoire ? pourquoi tu alloues n+1 entiers pour stocker une valeur n ?
 
pis si tu penses à allouer, pense à désallouer aussi...


Code :
  1. typedef struct { int sommet; int tab[N];  } pile;


Message édité par Zipo le 03-12-2003 à 00:21:26

---------------
- mon feed-back
n°581962
Taz
bisounours-codeur
Posté le 03-12-2003 à 00:21:14  profilanswer
 

n = (pile *)malloc(sizeof(int) * (n+1))
 
 
:non: !
 
n = malloc( (n+1) * sizeof *n);
 
ou à la rigueur
 
n = malloc( (n+1) * sizeof(int));
 
mais par pitié, dégagez moi ces casts à la con

n°581964
Taz
bisounours-codeur
Posté le 03-12-2003 à 00:21:58  profilanswer
 

Zipo a écrit :


Code :
  1. typedef struct { int sommet; int tab[N];  } pile;



non c'est mauvais ça, faut recompiler à chaque fois. l'allocation dynamique est bien meilleur

n°581966
Zipo
Ours bipolaire
Posté le 03-12-2003 à 00:23:13  profilanswer
 

Taz a écrit :

n = (pile *)malloc(sizeof(int) * (n+1))
 
 
:non: !
 
n = malloc( (n+1) * sizeof *n);
 
ou à la rigueur
 
n = malloc( (n+1) * sizeof(int));
 
mais par pitié, dégagez moi ces casts à la con


Ah ? en cours on nous dit de les mettre pourtant
A quoi ça sert de les supprimer précisement ?


---------------
- mon feed-back
mood
Publicité
Posté le 03-12-2003 à 00:23:13  profilanswer
 

n°581968
Zipo
Ours bipolaire
Posté le 03-12-2003 à 00:24:52  profilanswer
 

Taz a écrit :

non c'est mauvais ça, faut recompiler à chaque fois. l'allocation dynamique est bien meilleur


Oui mais faut bien que je définisse le type pile non ?
J'ai cité ça juste pour dire que j'avais besoin d'allouer de la place pour un tableau de n entiers + 1 entier en réponse à jagstang


Message édité par Zipo le 03-12-2003 à 00:25:17

---------------
- mon feed-back
n°581970
Taz
bisounours-codeur
Posté le 03-12-2003 à 00:25:42  profilanswer
 

je te demandes plutot à quoi ça sert ?
 
en C les conversion truc* <-> void* sont sures et parfaitement définies. récemment ici, on a eu l'exemple de cast en trop qui faisait des erreurs de compilation, cast qui une fois enlevaient donner le comportement correct et attendu

n°581975
Zipo
Ours bipolaire
Posté le 03-12-2003 à 00:28:31  profilanswer
 

Taz a écrit :

je te demandes plutot à quoi ça sert ?
 
en C les conversion truc* <-> void* sont sures et parfaitement définies. récemment ici, on a eu l'exemple de cast en trop qui faisait des erreurs de compilation, cast qui une fois enlevaient donner le comportement correct et attendu


 
Ah bon, ok je les enlève alors, moi tout ce que mon prof avait trouvé à me dire comme explication c'est :
"Ca sert à rapeller à n qu'il est un pointeur sur pile"
Alors forcément c'est léger :o


---------------
- mon feed-back
n°582093
docwario
Alea jacta est
Posté le 03-12-2003 à 03:04:24  profilanswer
 

euh juste comme ca, ya beaucoup plus rapide :
la récursivité !
 

Code :
  1. // src, dest et tmp sont les numeros des tours.
  2. void    hanoi_engine(int nb_disk, int src, int dest, int tmp)
  3. {
  4.   if (nb_disk == 1)
  5.     printf("%i -> %i\n", src, dest);
  6.   else
  7.     {
  8.       hanoi_engine(nb_disk - 1, src, tmp, dest);
  9.       printf("%i -> %i\n", src, dest);
  10.       hanoi_engine(nb_disk - 1, tmp, dest, src);
  11.     }
  12. }


 
tu dois afficher l etat des tours a chaque mouvement, ou juste afficher les deplacements ?
 
le code ci dessus t affiche les deplacements a faire.
 
 
edit : ...j avoue, j ai pas eu le courage de regarder ton code


Message édité par docwario le 03-12-2003 à 03:09:14
n°582587
Zipo
Ours bipolaire
Posté le 03-12-2003 à 19:33:41  profilanswer
 

DocWario a écrit :

euh juste comme ca, ya beaucoup plus rapide :
la récursivité !
 

Code :
  1. // src, dest et tmp sont les numeros des tours.
  2. void    hanoi_engine(int nb_disk, int src, int dest, int tmp)
  3. {
  4.   if (nb_disk == 1)
  5.     printf("%i -> %i\n", src, dest);
  6.   else
  7.     {
  8.       hanoi_engine(nb_disk - 1, src, tmp, dest);
  9.       printf("%i -> %i\n", src, dest);
  10.       hanoi_engine(nb_disk - 1, tmp, dest, src);
  11.     }
  12. }


 
tu dois afficher l etat des tours a chaque mouvement, ou juste afficher les deplacements ?
 
le code ci dessus t affiche les deplacements a faire.
 
 
edit : ...j avoue, j ai pas eu le courage de regarder ton code


 
Oui le code que tu m'a mis je l'avais fait mais il ne fait qu'afficher les déplacements en fait.
Moi je voulais afficher l'état des piles au début, et l'état des piles à la fin, avec la fonction récursive "hanoi" au milieu
Donc en fait à la place de l'affichage printf("%i -> %i\n", src, dest);  pour moi src et dest étaient de type pile et je faisais c = depiler(src)  puis  empiler(c, dest)   mais ça ne marchait pas ... voir mon code au dessus...


---------------
- mon feed-back
n°582597
theShockWa​ve
I work at a firm named Koslow
Posté le 03-12-2003 à 20:06:33  profilanswer
 

La lisibilité, y'a que ca de vrai :
http://remus.rutgers.edu/~rhoads/Code/hanoi3.c
 
Edit : j'suis sympa, je fais même le lien :D


Message édité par theShockWave le 03-12-2003 à 20:07:13
n°582621
Zipo
Ours bipolaire
Posté le 03-12-2003 à 21:11:20  profilanswer
 

Code :
  1. #include <stdio.h> 
  2. #include <stdlib.h>
  3. int **creermatrice(int l, int c)
  4. { int i,**p;
  5.   p = malloc(sizeof(int *) * l);
  6.   for (i=0 ; i<l ; i++)
  7.       { p[i] = malloc(sizeof(int) * c); }
  8.     return(p);
  9. }
  10. int **liremat(int l)
  11. { int **p;
  12.   int i, j;
  13.   p=creermatrice(l,3);
  14.   for (i=0 ; i<l ; i++)
  15.     {   for (j=0 ; j<3 ; j++)
  16.             {  if (j) p[i][j] = 0;
  17.                else  p[i][j] = i+1;
  18.              }
  19.     }
  20. return p;
  21. }
  22. void ecriremat(int **p, int l)
  23. { int i, j;
  24.   for (i=0 ; i<l ; i++)
  25.       {   for (j=0 ; j<3 ; j++)
  26.           {  printf("%d\t", p[i][j]);  }
  27.  printf("\n\n\n" );
  28.   }
  29. }
  30.     void hanoi(int **p, int n, int un, int deux, int trois)
  31.     {  int i, j;
  32.           if (n == 0 ) {;}
  33.               else 
  34.               {     hanoi(p, n-1, un, trois, deux);
  35.                                        
  36.        /*  printf("\n%d -> %d", un, trois);
  37.           Je veux depiler p[i][un] et empiler sur p[j][trois]
  38.        */
  39.                     hanoi(p, n-1, deux, un, trois);
  40.               } 
  41.     } 
  42.      
  43.      
  44.     int main() 
  45.     {  int **p;
  46.        int n;
  47.         printf("Nombre d anneaux ? : " ); 
  48.         scanf("%d", &n); 
  49.         p = liremat(n);
  50.         printf("\n\n" );
  51.         ecriremat(p, n);
  52.        
  53.         hanoi(p, n, 0, 1, 2);
  54.         printf("\n\nApres le jeu :\n\n" );
  55.         ecriremat(p, n);
  56.         return 0; 
  57.     }


 
Je l'ai fait d'une autre manière (sans structure pile) avec une matrice de 3 colonnes, peut être vous verrez ce que j'aimerai faire, cad pas seulement afficher les changements à faire (ca c facile) je veux modifier la matrice a chaque fois, j'ai essayé plein de trucs mais ca ne marche pas ... comment prendre le dernier élèment non nul de la 1ere colonne et le mettre au dessus du dernier élème non nul de la 3eme colonne ?


Message édité par Zipo le 03-12-2003 à 22:25:14

---------------
- mon feed-back
n°582634
ffluff
Challenge Everything
Posté le 03-12-2003 à 21:25:06  profilanswer
 

Zipo a écrit :


Tu peux réexpliquer plus détaillé stp ?
Moi j'ai ca :
pour déplacer n anneaux du piquet 1 au piquet 3 :
- déplacer n-1 anneaux du piquet 1 au piquet 3
- déplacer l'anneau du piquet 1 au piquet 2
- déplacer n-1 anneaux du piquet 3 au piquet 2
 


 :non:  
 
pour deplacer n anneau de 1 vers 3
deplacer n-1 anneaux de 1 sur 2
deplacer l'anneau n de 1 vers 3
deplacer les n-1 anneaux de 2 sur 3
 
1 |  
2 |  
3 | |
 
| | |
| 1 |
3 2 |
 
| | |
| 1 |
| 2 3
 
| | 1
| | 2
| | 3
 
edit merder les espaces sont aps bien concervé
edit 2: algo :P


Message édité par ffluff le 03-12-2003 à 22:38:33

---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
n°582662
Taz
bisounours-codeur
Posté le 03-12-2003 à 22:05:18  profilanswer
 

virer moi ces casts :o

n°582696
torpe23
Posté le 03-12-2003 à 22:52:06  profilanswer
 

pkoi tu fais pas juste:  
pile *un = malloc(sizeof(pile)); ???
 
Et puis, ta variable sommet fait n'importe quoi!
Tu ajoutes à l'indice "sommet" (donc la case ne contient rien) et tu retire à l'indice "sommet" (qui ne contient tjs rien!). Il faut que tu retire à l'indice "sommet - 1".

n°582699
MagicBuzz
Posté le 03-12-2003 à 23:01:41  profilanswer
 

Z'êtes pas joueurs...
 
Un vrai challenge : Faire une scène 3D sous PovRay utilisant son langage de script pour à la fois faire l'algo, et son rendu 3D.
 
Ca donne ça au final :
 
http://membres.lycos.fr/lagaffeuse/

n°583042
Moktar1er
No one replies...
Posté le 04-12-2003 à 14:22:05  profilanswer
 

MagicBuzz a écrit :

Z'êtes pas joueurs...
 
Un vrai challenge : Faire une scène 3D sous PovRay utilisant son langage de script pour à la fois faire l'algo, et son rendu 3D.
 
Ca donne ça au final :
 
http://membres.lycos.fr/lagaffeuse/


 
:love:  
magnifique clap clap clap
c'est du pov?

n°583058
MagicBuzz
Posté le 04-12-2003 à 14:55:32  profilanswer
 

yes, c'est un autiste le gars c'est pas possible autrement :D
 
t'imagine le truc : en C c'est relou à faire...
 
en langage à la con POV, ça doit être la mort à porter... mais en plus le gars pousse le vice jusqu'à animer un bras :pt1cable:
 
en tout cas, je me suis fracturé tous les os des fesses en voyant ça pour la première fois :D

n°583060
Moktar1er
No one replies...
Posté le 04-12-2003 à 14:58:23  profilanswer
 

A mon avis ça doit faire une note de TP sympa quand tu rends ça au prof, j'imagine la tête ;-)
Déjà qu'on avait poussé le vice à faire des simulation de TP d'autom. (asservissement, bras de robot etc.) en OpenGL, mais faire Hanoï en POV là je m'incline.
Il mèrite un Oscar le mec.

n°583123
ffluff
Challenge Everything
Posté le 04-12-2003 à 16:21:49  profilanswer
 

trop fort !! en POV !!!
 
parcontre les couleurs bof [:ffluff]


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
n°584009
Zipo
Ours bipolaire
Posté le 05-12-2003 à 19:40:02  profilanswer
 

Code :
  1. #include <stdio.h>                                                   
  2. #include <stdlib.h>                                                 
  3. int N, cpt=0;                                                               
  4.                                                                      
  5. int **creermatrice(int l, int c)                                     
  6. { int i,**p;                                                         
  7.   p = (int **)malloc(sizeof(int *) * l);                             
  8.   for (i=0 ; i<l ; i++)                                             
  9.       { p[i] = (int *)malloc(sizeof(int) * c); }                     
  10.     return(p);                                                       
  11. }                                                                   
  12.                                                                      
  13. int **liremat(int l)                                                 
  14. { int **p;                                                           
  15.   int i, j;                                                         
  16.   p=creermatrice(l,3);                                               
  17.                                                                      
  18.   for (i=0 ; i<l ; i++)                                             
  19.     {   for (j=0 ; j<3 ; j++)                                       
  20.             {  if (j) p[i][j] = 0;                                   
  21.                else  p[i][j] = i+1;                                 
  22.              }                                                       
  23.     }                                                               
  24. return p;                                                           
  25. }                                                                   
  26.                                                                      
  27.                                                                      
  28. void ecriremat(int **p, int l)                                       
  29. { int i, j;
  30.   printf("\n\n" );                                                         
  31.   for (i=0 ; i<l ; i++)                                             
  32.       {   for (j=0 ; j<3 ; j++)                                     
  33.           {  if (p[i][j] == 0) printf(".\t" );
  34.        else printf("%d\t", p[i][j]);  }                           
  35.  printf("\n" );                                                 
  36.   }
  37. printf("-------------------" );                                                                   
  38. }                                                                   
  39.                                                                      
  40. void traiter(int **p, int d, int a, int n)
  41. {
  42.    int i=0, v;
  43.    while ( (i<n) && (p[i][d] == 0) )
  44.            i++;
  45.    
  46.  if (i<n) { v = p[i][d];
  47.             p[i][d] = 0;
  48.     }
  49.   i=n-1;
  50.   while ( (i>=0) && (p[i][a] != 0) )
  51.             i--;
  52.   if (i>=0)
  53.       p[i][a] = v;
  54.   cpt++;
  55.   ecriremat(p, N);
  56.   }
  57.                                                                      
  58.                                                                      
  59.     void hanoi(int **p, int n, int un, int deux, int trois)         
  60.     {                                                       
  61.           if (n == 0 ) {;}                                           
  62.               else                                                   
  63.               { hanoi(p, n-1, un, trois, deux);                     
  64.                    
  65.      traiter(p, un, trois, N);
  66.                                                    
  67.                  hanoi(p, n-1, deux, un, trois);                 
  68.               }                                                     
  69.     }                                                               
  70.    
  71.              
  72.                                                                  
  73.                                                                      
  74.                                                                      
  75.     int main()                                                       
  76.     {  int **p;
  77.                                                                      
  78.         printf("Nombre d anneaux ? : " );                             
  79.         scanf("%d", &N);                                             
  80.        
  81.  p = liremat(N);                                             
  82.         printf("\n\n" );                                             
  83.         ecriremat(p, N);                                             
  84.                                                                      
  85.         hanoi(p, N, 0, 1, 2);                                       
  86.                                                                    
  87.         printf("\n\nRealise en %d operations\n\n", cpt);                                             
  88.                                                                      
  89.         return 0;                                                   
  90.     }


C bon j'ai réussi comme ceci
Merki!


Message édité par Zipo le 06-12-2003 à 00:12:30

---------------
- mon feed-back
n°584014
Taz
bisounours-codeur
Posté le 05-12-2003 à 19:42:18  profilanswer
 

oh my god !

n°584079
red factio​n
Posté le 05-12-2003 à 20:54:00  profilanswer
 

moi je resolvais le prob en qq lignes  :o

n°584121
MagicBuzz
Posté le 05-12-2003 à 21:48:11  profilanswer
 

red faction a écrit :

moi je resolvais le prob en qq lignes  :o  


moi aussi, regarde, en une seule ligne :ange:
 

Code :
  1. #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;}


 
Et ça comile très bien en plus :ange:


Message édité par MagicBuzz le 05-12-2003 à 21:48:31
n°584124
red factio​n
Posté le 05-12-2003 à 21:53:07  profilanswer
 

MagicBuzz a écrit :


moi aussi, regarde, en une seule ligne :ange:
 

Code :
  1. #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;}


 
Et ça comile très bien en plus :ange:


 
 
 :D mais serieux cetait vraiment tres tres court plus que ca encor

n°584127
MagicBuzz
Posté le 05-12-2003 à 21:55:26  profilanswer
 

je te crois ;) ct juste histoire de dire ma première connerie de la soirée :D

n°584131
gilou
Modérateur
Modosaurus Rex
Posté le 05-12-2003 à 22:05:46  profilanswer
 

Bon, le buzzeur, les [:jpa] te pendent au nez...
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
n°584136
yannick_fr​ere
Posté le 05-12-2003 à 22:20:56  profilanswer
 

Zipo a écrit :


 
Ah bon, ok je les enlève alors, moi tout ce que mon prof avait trouvé à me dire comme explication c'est :
"Ca sert à rapeller à n qu'il est un pointeur sur pile"
Alors forcément c'est léger :o


 
Ton prof t'a certainement conseillé de mettre les casts pour l'unique raison que sous certains environnements, le compilateur râle quand ils n'y sont pas.
C'est donc un soucis de portabilité, mais effectivement ça marche d'habitude très bien sans. Tu ne fais rien de mal en les laissant.

n°584169
Zipo
Ours bipolaire
Posté le 06-12-2003 à 00:11:37  profilanswer
 

red faction a écrit :

moi je resolvais le prob en qq lignes  :o  


Oui si on veut on met juste 4 lignes pour la fonction hanoi en lui faisant afficher le déplacement entre 2 appels récursifs, menfin de la manière comme je l'ai fait ça fait tous les changements physiquement dans une matrice et ça affiche tous les changements étape par étape.


---------------
- mon feed-back
n°584171
Zipo
Ours bipolaire
Posté le 06-12-2003 à 00:14:34  profilanswer
 

Taz a écrit :

oh my god !


Qu'est ce qui a ? Ya tant de bêtises que ça ?


---------------
- mon feed-back
n°584173
Zipo
Ours bipolaire
Posté le 06-12-2003 à 00:15:20  profilanswer
 

yannick_frere a écrit :


 
Ton prof t'a certainement conseillé de mettre les casts pour l'unique raison que sous certains environnements, le compilateur râle quand ils n'y sont pas.
C'est donc un soucis de portabilité, mais effectivement ça marche d'habitude très bien sans. Tu ne fais rien de mal en les laissant.


farpaitement :)
donc je les met dans un soucis de portabilité :o


---------------
- mon feed-back
n°584176
gilou
Modérateur
Modosaurus Rex
Posté le 06-12-2003 à 00:23:06  profilanswer
 

Tiens, en nettoyant un poil le code de zippo, on obtient ca, un poil plus propre et lisible...
 

Code :
  1. #include <stdio.h>                                                   
  2. #include <stdlib.h> 
  3. #include <time.h>                                               
  4.  
  5. typedef struct _Towers{
  6.   int height;
  7.   int *tower1, *tower2, *tower3;
  8.   int *stower1, *stower2, *stower3;
  9. }Towers;   
  10. Towers *createTowers(int nbrings)
  11. {
  12.   int i;
  13.   Towers *t = (Towers *) malloc(sizeof(Towers));
  14.  
  15.   t->height = nbrings;
  16.   t->tower1 = (int *) malloc(nbrings * sizeof(int));
  17.   for (i=0; i<nbrings; i++)
  18.     t->tower1[i] = i+1;
  19.   t->tower2 = (int *) calloc(nbrings, sizeof(int));
  20.   t->tower3 = (int *) calloc(nbrings, sizeof(int));
  21.   t->stower1 = t->tower1;
  22.   t->stower2 = t->tower2;
  23.   t->stower3 = t->tower3;
  24.   return t;
  25. void destroyTowers(Towers *t)
  26. {
  27.   if (t)
  28.     {
  29.       if (t->tower1)
  30. free(t->tower1);
  31.       if (t->tower2)
  32. free(t->tower2);
  33.       if (t->tower3)
  34. free(t->tower3);
  35.       free(t);
  36.     } 
  37. }
  38. void printContenu(int contenu)
  39. {
  40.   if (contenu)
  41.     printf("%d\t", contenu);
  42.   else
  43.     printf(".\t" );
  44. }                                                 
  45. void printTowers(Towers *t)
  46. {
  47.   int i;
  48.   printf("\n\n" );
  49.   for (i=0 ; i<t->height; i++)
  50.     {
  51.       printContenu(t->tower1[i]);
  52.       printContenu(t->tower2[i]);
  53.       printContenu(t->tower3[i]);
  54.       printf("\n" );
  55.     }
  56.   printf("-------------------" );
  57. }
  58. void echange12(Towers *t)
  59. {
  60.   int *temp = t->stower1;
  61.   t->stower1 = t->stower2;
  62.   t->stower2 = temp;
  63. }
  64. void echange23(Towers *t)
  65. {
  66.   int *temp = t->stower3;
  67.   t->stower3 = t->stower2;
  68.   t->stower2 = temp;
  69. void traiter(Towers *t)
  70. {
  71.   int i;
  72.   int temp = 0;
  73.   for (i=0; i<t->height; i++)
  74.     if (t->stower1[i])
  75.       {
  76. temp = t->stower1[i];
  77. t->stower1[i] = 0;
  78. break;
  79.       }
  80.    for (i = t->height-1; i>=0; i--)
  81. if (!t->stower3[i])
  82.   {
  83.     t->stower3[i]= temp;
  84.     break;
  85.   }
  86.   printTowers(t);
  87. }
  88. void Hanoi(Towers *t, int n, int *count)
  89. {
  90.   if (n)
  91.     {
  92.       echange23(t);
  93.       Hanoi(t, n-1, count);
  94.       echange23(t);
  95.       traiter(t);
  96.       (*count)++;
  97.       echange12(t);
  98.       Hanoi(t, n-1, count);
  99.       echange12(t);
  100.     }
  101. }
  102. int main()                                                       
  103.   Towers *t;
  104.   int nbrings;
  105.   int count = 0;
  106.   printf("Nombre d'anneaux? : " );                             
  107.   scanf("%d", &nbrings);                                             
  108.   t = createTowers(nbrings);
  109.                                      
  110.   printf("\n\n" ); 
  111.   printTowers(t);
  112.                                          
  113.   Hanoi(t, nbrings, &count);                                       
  114.   printf("\n\nRealise en %d operations\n\n", count);                                             
  115.   destroyTowers(t);
  116.   return 0;                                                   
  117. }


 
A+,


Message édité par gilou le 06-12-2003 à 00:34:07

---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
n°584193
Zipo
Ours bipolaire
Posté le 06-12-2003 à 01:08:02  profilanswer
 

Oui c'est mieux ton code, sinon j'ai vu que tu as libéré l'espace que tu avais aloué dynamiquement pour la matrice, c'est grave si on ne libère pas cet espace mémoire ? De tte facon après l'éxecution du prog le système peut écrire dessus librement non ? donc quel est vraiment l'intérêt du free() ?
 
Attention, pour ceux que je vois déja venir gueuler, je n'ai pas dis qu'il était inutile de libérer l'espace j'ai simplement demandé pourquoi cela était utile ?..


---------------
- mon feed-back
n°584194
Zipo
Ours bipolaire
Posté le 06-12-2003 à 01:08:50  profilanswer
 


 :non:


---------------
- mon feed-back
n°584196
gilou
Modérateur
Modosaurus Rex
Posté le 06-12-2003 à 01:20:10  profilanswer
 

Zipo a écrit :

Oui c'est mieux ton code, sinon j'ai vu que tu as libéré l'espace que tu avais aloué dynamiquement pour la matrice, c'est grave si on ne libère pas cet espace mémoire ? De tte facon après l'éxecution du prog le système peut écrire dessus librement non ? donc quel est vraiment l'intérêt du free() ?
 
Attention, pour ceux que je vois déja venir gueuler, je n'ai pas dis qu'il était inutile de libérer l'espace j'ai simplement demandé pourquoi cela était utile ?..


C'est inutile ici, mais il vaut mieux prendre de bonnes habitudes des le depart: desallouer tout ce qui n'est pas recupere par le programme.
Faire confiance a l'OS peut reveler des surprises...
D'autre part, une fois que c'est bien ecrit, et sans bug connu, tu peux dans une phase finale d'optimisation, virer une telle desallocation si tu sais que le systeme y retrouvera ses petits.  
Mais il faut toujours passer par une phase initiale ou l'on sait desallouer ce qui l'a ete (et pas que pour les allocations memoires; pour les fichiers ouverts et non fermés, les ressources systeme (ca s'est ameliore sous windows de nos jours, et j'ose esperer que c'est maintenant le cas sous MacOsX), etc.)
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  tours d'Hanoi

 

Sujets relatifs
Les tours Hanoi en java en applet ... Aidez moi Tour de Hanoï..
le probleme de hanoi 
Plus de sujets relatifs à : tours d'Hanoi


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)