tours d'Hanoi

tours d'Hanoi - C - Programmation

Marsh Posté le 02-12-2003 à 23:25:46    

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
Reply

Marsh Posté le 02-12-2003 à 23:25:46   

Reply

Marsh Posté le 02-12-2003 à 23:33:01    

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)
Reply

Marsh Posté le 02-12-2003 à 23:40:38    

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
Reply

Marsh Posté le 02-12-2003 à 23:44:32    

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
Reply

Marsh Posté le 02-12-2003 à 23:48:53    

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
Reply

Marsh Posté le 03-12-2003 à 00:04:36    

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...
 

Reply

Marsh Posté le 03-12-2003 à 00:20:21    

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
Reply

Marsh Posté le 03-12-2003 à 00:21:14    

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

Reply

Marsh Posté le 03-12-2003 à 00:21:58    

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

Reply

Marsh Posté le 03-12-2003 à 00:23:13    

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
Reply

Marsh Posté le 03-12-2003 à 00:23:13   

Reply

Marsh Posté le 03-12-2003 à 00:24:52    

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
Reply

Marsh Posté le 03-12-2003 à 00:25:42    

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

Reply

Marsh Posté le 03-12-2003 à 00:28:31    

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
Reply

Marsh Posté le 03-12-2003 à 03:04:24    

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
Reply

Marsh Posté le 03-12-2003 à 19:33:41    

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
Reply

Marsh Posté le 03-12-2003 à 20:06:33    

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
Reply

Marsh Posté le 03-12-2003 à 21:11:20    

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
Reply

Marsh Posté le 03-12-2003 à 21:25:06    

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
Reply

Marsh Posté le 03-12-2003 à 22:05:18    

virer moi ces casts :o

Reply

Marsh Posté le 03-12-2003 à 22:52:06    

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".

Reply

Marsh Posté le 03-12-2003 à 23:01:41    

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/

Reply

Marsh Posté le 04-12-2003 à 14:22:05    

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?

Reply

Marsh Posté le 04-12-2003 à 14:55:32    

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

Reply

Marsh Posté le 04-12-2003 à 14:58:23    

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.

Reply

Marsh Posté le 04-12-2003 à 16:21:49    

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


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
Reply

Marsh Posté le 05-12-2003 à 19:40:02    

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
Reply

Marsh Posté le 05-12-2003 à 19:42:18    

oh my god !

Reply

Marsh Posté le 05-12-2003 à 20:54:00    

moi je resolvais le prob en qq lignes  :o

Reply

Marsh Posté le 05-12-2003 à 21:48:11    

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
Reply

Marsh Posté le 05-12-2003 à 21:53:07    

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

Reply

Marsh Posté le 05-12-2003 à 21:55:26    

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

Reply

Marsh Posté le 05-12-2003 à 22:05:46    

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


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-12-2003 à 22:20:56    

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.

Reply

Marsh Posté le 06-12-2003 à 00:11:37    

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
Reply

Marsh Posté le 06-12-2003 à 00:14:34    

Taz a écrit :

oh my god !


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


---------------
- mon feed-back
Reply

Marsh Posté le 06-12-2003 à 00:15:20    

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
Reply

Marsh Posté le 06-12-2003 à 00:23:06    

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! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-12-2003 à 01:08:02    

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
Reply

Marsh Posté le 06-12-2003 à 01:08:50    


 :non:


---------------
- mon feed-back
Reply

Marsh Posté le 06-12-2003 à 01:20:10    

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! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed