tours d'Hanoi - C - Programmation
Marsh Posté le 02-12-2003 à 23:33:01
Code :
|
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...
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
Marsh Posté le 02-12-2003 à 23:44:32
Harkonnen a écrit :
|
Bah c'est pas n'importe quoi, ca marche cette écriture non ?
Marsh Posté le 02-12-2003 à 23:48:53
fFluFf a écrit : comment ca "ca marche pas vraiment " ? |
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
Marsh Posté le 03-12-2003 à 00:04:36
Code :
|
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...
Marsh Posté le 03-12-2003 à 00:20:21
JagStang a écrit :
|
Code :
|
Marsh Posté le 03-12-2003 à 00:21:14
n = (pile *)malloc(sizeof(int) * (n+1))
!
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
Marsh Posté le 03-12-2003 à 00:21:58
Zipo a écrit :
|
non c'est mauvais ça, faut recompiler à chaque fois. l'allocation dynamique est bien meilleur
Marsh Posté le 03-12-2003 à 00:23:13
Taz a écrit : n = (pile *)malloc(sizeof(int) * (n+1)) |
Ah ? en cours on nous dit de les mettre pourtant
A quoi ça sert de les supprimer précisement ?
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
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
Marsh Posté le 03-12-2003 à 00:28:31
Taz a écrit : je te demandes plutot à quoi ça sert ? |
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
Marsh Posté le 03-12-2003 à 03:04:24
euh juste comme ca, ya beaucoup plus rapide :
la récursivité !
Code :
|
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
Marsh Posté le 03-12-2003 à 19:33:41
DocWario a écrit : euh juste comme ca, ya beaucoup plus rapide :
|
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...
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
Marsh Posté le 03-12-2003 à 21:11:20
Code :
|
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 ?
Marsh Posté le 03-12-2003 à 21:25:06
Zipo a écrit : |
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
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".
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/
Marsh Posté le 04-12-2003 à 14:22:05
MagicBuzz a écrit : Z'êtes pas joueurs... |
magnifique clap clap clap
c'est du pov?
Marsh Posté le 04-12-2003 à 14:55:32
yes, c'est un autiste le gars c'est pas possible autrement
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
en tout cas, je me suis fracturé tous les os des fesses en voyant ça pour la première fois
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.
Marsh Posté le 04-12-2003 à 16:21:49
trop fort !! en POV !!!
parcontre les couleurs bof
Marsh Posté le 05-12-2003 à 19:40:02
Code :
|
C bon j'ai réussi comme ceci
Merki!
Marsh Posté le 05-12-2003 à 21:48:11
red faction a écrit : moi je resolvais le prob en qq lignes |
moi aussi, regarde, en une seule ligne
Code :
|
Et ça comile très bien en plus
Marsh Posté le 05-12-2003 à 21:53:07
MagicBuzz a écrit :
|
mais serieux cetait vraiment tres tres court plus que ca encor
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
Marsh Posté le 05-12-2003 à 22:05:46
Bon, le buzzeur, les te pendent au nez...
A+,
Marsh Posté le 05-12-2003 à 22:20:56
Zipo 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.
Marsh Posté le 06-12-2003 à 00:11:37
red faction a écrit : moi je resolvais le prob en qq lignes |
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.
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 ?
Marsh Posté le 06-12-2003 à 00:15:20
yannick_frere a écrit : |
farpaitement
donc je les met dans un soucis de portabilité
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 :
|
A+,
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 ?..
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() ? |
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+,
Marsh Posté le 02-12-2003 à 23:25:46
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