Tour de Hanoï..

Tour de Hanoï.. - C++ - Programmation

Marsh Posté le 22-06-2002 à 18:51:57    

Voilà donc j'ai un projet info à faire sur le jeu "les tours de Hanoï" en C.
 
Ceux qui ont déjà fait un pg sur ce jeu serait sympa de m'éclairer sur le sujet. Merci
 
Ceux qui ne connaissent pas le jeu. Faites le moi savoir je vous expliquerais brièvement.
 
Merci d'avance

Reply

Marsh Posté le 22-06-2002 à 18:51:57   

Reply

Marsh Posté le 22-06-2002 à 18:54:23    

Tu veux quoi exactement ? Si c'est un truc tout fait tout cuit je pense pas que tu obtiennes quelque chose...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 22-06-2002 à 19:00:32    

Non pas forcément.
 
Mais si on pouvait m'aider par ex sur les types de fonctions à utiliser etc...

Reply

Marsh Posté le 22-06-2002 à 19:09:00    

à question vague, lassitude de répondre.
 
à question spécifique, réponse spécifique.

Reply

Marsh Posté le 22-06-2002 à 19:12:31    

1 seule fonction récursive et basta.

Reply

Marsh Posté le 22-06-2002 à 19:14:41    

Ah le bon vieux classique des tours de Hanoï.
 
Bon quelques pistes de travail:
 
A) L'approche à utiliser c'est "diviser pour résoudre" (ie: penser récursivité)
 
B) Décompose en 3 sous pbs:
tu dispose de 3 batons qu'on va appeler: G, M et D et de n disques initialement sur G et que tu veux mettre sur D.
pb1: deplacer (n-1) disques de G sur M
pb2: deplacer le disque restant de G sur D
pb3: deplacer les (n-1) disques de M sur D
 
C) les pb1 et pb3 sont recursifs !
 
D) La complexité de l'algo. est gigantesque: c'est du O(2^n). En clair, t'étonne pas qu'il y ait 10 minutes de calcul avec ton super bi-P4 2GHz pour n=30. Et ne pense même pas à essayer de résoudre le problème pour n>50.
Et non, il n'y a pas d'algo. plus performant pour résoudre le pb. des tours de Hanoï.

Reply

Marsh Posté le 22-06-2002 à 22:26:21    

youdontcare a écrit a écrit :

à question vague, lassitude de répondre.
 
à question spécifique, réponse spécifique.  




 
n'est ce pas ? surtout qu'a mon avis, un tour sur google et c bon........

Reply

Marsh Posté le 23-06-2002 à 00:09:52    

effectiment, on peut trouver des sources toutes faites a pas mal d'endroits..

Reply

Marsh Posté le 23-06-2002 à 11:22:25    

En gros il suffit de faire ça :) (n'oublie pas de remplacer les cout par les manipulations de stack décrites ...
 

Code :
  1. void Hanoi (unsigned n, char src, char dst, char tmp) {
  2.    if (n) {
  3.       Hanoi(n-1, src, tmp, dst);
  4.       cout << "Déplacer le disque " << n;
  5.       cout << " du piquet " << src;
  6.       cout << " au piquet " << dst << endl;
  7.       Hanoi(n-1, tmp, dst, src);
  8.    }
  9. }

Reply

Marsh Posté le 24-06-2002 à 12:13:02    

Pompé sur le manuel de ma TI-92 :
 
deplace(n,a,b)
Prgm
 
If n = 1 then
  Pause string(a)&" -> "&string(b)
Else
  deplace(n-1,a,6-a-b)
  deplace(1,a,b)
  deplace(n-1,6-a-b,b)
EndIf
EnPrgm
 
 
Voilà, c'est tout!


---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 24-06-2002 à 12:13:02   

Reply

Marsh Posté le 24-06-2002 à 12:37:12    

ITM a écrit a écrit :

Pompé sur le manuel de ma TI-92 :
deplace(n,a,b)
Prgm
 
If n = 1 then
  Pause string(a)&" -> "&string(b)
Else
  deplace(n-1,a,6-a-b)
  deplace(1,a,b)
  deplace(n-1,6-a-b,b)
EndIf
EnPrgm




Bizarre ton programme.  
Normalement la fonction Hanoï prend 4 paramètres: le nombre n de disques et les 3 piles.
Et je ne comprend pas très bien ta formule: 6-a-b
Ca correspond à quoi exactement ?

Reply

Marsh Posté le 24-06-2002 à 12:45:55    

Les paramétres sont :
n = le nombres de disques à déplacer
a = le premier piquet
b = le dernier piquet
 
On déplace les n disques du piquet a au piquet b
Par exemple, seplace(3,1,3) va déplacer 3 anneaux du piquet 1 vers le piquet 3


---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 24-06-2002 à 13:48:48    

Effectivement, ça fonctionne.  
Mais ça fait vraiment un peu magique cette formule (6-a-b).  
Par contre, ça implique que les piquets soient appelés 1, 2 et 3.

Reply

Marsh Posté le 24-06-2002 à 14:02:43    

ouais, mais au moins, ca marche avec autant de piquets qu'on veut!


---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 07-04-2003 à 11:17:47    

Bon pour le peu de prog que je fais, on va dire que j'ai l'habitude du java, et la je dois résoudre le problème des tours de hanoi en C. Je ne sais pas quoi utiliser pour représenter les tours : une structure ?? en effet je ne vois pas quoi prendre à part les objets :|  (mais y a pas d objet en c sniff :/ )
 
Pour l'algo je pense qu'il y a un bon aiguillage ici, mais quel type utiliser pour représenter les tours ? les palets qui sont dessus ?
 
Merci pour tout :o)


---------------
Life is short, Take it easy :)
Reply

Marsh Posté le 07-04-2003 à 11:36:26    

C'est marrant j'ai fait le même exercice il y a 2 ans à l'INSA de Lyon (dép Télécom !).
 
Va fouiller http://www.dio.fr.st pour le code source (c pas mon site mais celui d'un pote) ;) ;) ;)

Reply

Marsh Posté le 07-04-2003 à 19:10:32    

Code :
  1. main(
  2.               ){int
  3.             z,y,n
  4.        ;scanf("%d",&n);
  5.        for(y=1;(1<<n)-y
  6.        ;y<<=z-1,printf(
  7. "disk %i from %i to %i.\n"/**/
  8. ,z,(y&y-1)%3,((y|y-1)+1)%3),y
  9.   ++)for(z=1;!(y&1);z++,y>>=1);}


 
à bas la récursivité ! Vive les algos itératifs qui déchirent leur môman ! :D
 
 
 
(edit : ajustement de l'indentation du code)
 
C'est pas de moi ! C'est dispo là : http://remus.rutgers.edu/~rhoads/Code/code.html
 
Je précise que l'algo est complet (collez-le dans un fichier .c et il marche avec affichage et tout !)


Message édité par theshockwave le 07-04-2003 à 19:12:19
Reply

Marsh Posté le 07-04-2003 à 19:12:22    


 
IOCCC roulaize


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 08-04-2003 à 19:06:33    

theShOcKwAvE a écrit :


à bas la récursivité ! Vive les algos itératifs qui déchirent leur môman ! :D


 
Surtout que dans le cas des tours de Hanoi y'a pas de différence de complexité entre la version itérative et la version récursive...

Reply

Marsh Posté le 08-04-2003 à 19:34:53    

Ace17 a écrit :


 
Surtout que dans le cas des tours de Hanoi y'a pas de différence de complexité entre la version itérative et la version récursive...


 
par complexité, je supposes que tu entends temps de calcul nécessaire par itération ... Parce que l'algo en lui même est assez 'complexe' ! :D

Reply

Marsh Posté le 09-04-2003 à 15:32:51    

salut, j'ai le meme projet que toi à faire Rast@rthur,
j'avé pensé faire un tableau à 2 dimension pour ça, mais j'arrive pa à le coder...
donc question... comment on déclare un tableau à 2 dimensions??? (malloc, etc.???)
 :hello:
edit :
j'ai roué un truc sympa pour ça:
char **tab;
 
/* METHODE 1 */
/* Allocation de la 1er dimension */
tab = (char **) malloc ( sizeof (char *) * taille);  
 
/* Allocation des tableaux */
for (i=0; i<taille; i++) {
    tab[i] = (char *) malloc ( sizeof (char ) * taille2);
     
}  
 
mais bon allez savoir si c 'est possible de résoudre cet algo avec un tablo à 2 dim  :??:  :??:  :??:


Message édité par vandekerput le 09-04-2003 à 15:43:50
Reply

Marsh Posté le 09-04-2003 à 16:33:13    

Vandekerput a écrit :

salut, j'ai le meme projet que toi à faire Rast@rthur,
j'avé pensé faire un tableau à 2 dimension pour ça, mais j'arrive pa à le coder...
donc question... comment on déclare un tableau à 2 dimensions??? (malloc, etc.???)
 :hello:
edit :
j'ai roué un truc sympa pour ça:
char **tab;
 
/* METHODE 1 */
/* Allocation de la 1er dimension */
tab = (char **) malloc ( sizeof (char *) * taille);  
 
/* Allocation des tableaux */
for (i=0; i<taille; i++) {
    tab[i] = (char *) malloc ( sizeof (char ) * taille2);
     
}  
 
mais bon allez savoir si c 'est possible de résoudre cet algo avec un tablo à 2 dim  :??:  :??:  :??:  


 
il te plait pas mon algo ? :heink:
 
:D
je ne suis pas sur que ce soit la meilleure solution de passer par des tableaux de taille fixe ...
 
En fait, ca dépend des libertés de ton projet. Mais avec une petite recherche sur google, j'avais trouvé des algos qui permettaient de résoudre le pb des tours de Hanoi quel que soit le nb de piliers et de pièces (si plus de trois piliers, on précise le pilier dest ...)
 
Mais l'algo que j'ai donné plus haut possède des avantages par rapport aux autres algos :
1 - il est très rapide (travail sur les bits principalement et pas d'appel de fonction successifs comme pour les fonctions récursives)
2 - il n'alloue pas de mem inutile.
3 - ne s'embourbe jamais dans un chemin faux qu'il serait obligé de backtracker : l'algo converge directement vers la bonne solution ...
 
Juste un petit bug : suivant si le nb de pièces est pair ou impair, le pilier de destination sera le 2eme ou le 3eme ... Mais c'est un problème facile à contourner ... :D

Reply

Marsh Posté le 09-04-2003 à 18:25:33    

theShOcKwAvE a écrit :


 
par complexité, je supposes que tu entends temps de calcul nécessaire par itération ... Parce que l'algo en lui même est assez 'complexe' ! :D


 
Oui, bien sur, je parle du temps de calcul... Apres, il est vrai que la version itérative est un peu plus compliquée que celle récursive, mais bon... ca reste relativement simple comme algo.
 
edit : a condition de pas l'écrire comme tu nous l'a montré :D


Message édité par Ace17 le 09-04-2003 à 18:26:29
Reply

Marsh Posté le 09-04-2003 à 23:16:08    

Ace17 a écrit :


 
Oui, bien sur, je parle du temps de calcul... Apres, il est vrai que la version itérative est un peu plus compliquée que celle récursive, mais bon... ca reste relativement simple comme algo.
 
edit : a condition de pas l'écrire comme tu nous l'a montré :D


 

Code :
  1. main() {
  2.   int z,y,n;
  3.   scanf("%d",&n);
  4.   for( y=1; (1<<n)-y; y<<=z-1,
  5.                       printf("disk %i from %i to %i.\n",z,(y&y-1)%3,((y|y-1)+1)%3),
  6.                       y++)
  7.     for(z=1;!(y&1);z++,y>>=1);
  8. }


 
C'est déjà un peu mieux ! :D
 
Voila la version tip top ! ;)

Code :
  1. main() {
  2.   int z,y,n;
  3.   scanf("%d",&n);
  4.   for( y=1; (1<<n)-y; y++) {
  5.     z = 1;
  6.     while(!(y&1)) {
  7.       z++;
  8.       y>>=1;
  9.     }
  10.     y<<=z-1;
  11.     printf("disk %i from %i to %i.\n",z,(y&y-1)%3,((y|y-1)+1)%3);
  12.   }
  13. }


 
Voilàààà ... :D
 
 
Edit : Je ne l'ai pas précisé, mais le n est le nombre de pièces sur la tour de départ ...


Message édité par theshockwave le 09-04-2003 à 23:17:04

---------------
last.fm
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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