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

  FORUM HardWare.fr
  Programmation
  C++

  tour de hanoi(algorithme recursif)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

tour de hanoi(algorithme recursif)

n°1780353
houcem001
Posté le 30-08-2008 à 17:19:48  profilanswer
 

salut
je suis entrain de programmer le tour de hanoi mais j'ai un probleme au deplacement automatique des disques. je souhaite que les disques se deplace un apres l'autre et non un bloc de disques.
voila les fichiers que je vous ai envoyer "main.cpp" , "MaFenetre.h" et "MaFenetre.cpp".
s'il vous plait compilez ce code et aidez moi à trouver le truc qui cloche.
merci beaucoup
 
main.cpp:

Code :
  1. #include<QApplication>
  2. #include <QTranslator>
  3. #include <QLocale>
  4. #include <QLibraryInfo>
  5. #include"MaFenetre.h"
  6. int main(int argc,char *argv[])
  7. {
  8.     QApplication app(argc,argv);
  9.     MaFenetre fenetre;
  10.     fenetre.show();
  11.     fenetre.afficherDisques();
  12.     return app.exec();
  13. }


MaFenetre.h :

Code :
  1. #ifndef DEF_MAFENETRE
  2. #define DEF_MAFENETRE
  3. #include <QApplication>
  4. #include <QWidget>
  5. #include <QpaintDevice>
  6. #include <QPushButton>
  7. #include <QInputDialog>
  8. #include <QMessageBox>
  9. #include <QPainter>
  10. #include <QRectF>
  11. #include <QGraphicsRectItem>
  12. #include <QpaintEngine>
  13. #include <QPaintEvent>
  14. #include <QVector>
  15. #include <QDialog>
  16. #include <QPointF>
  17. #include <QRegion>
  18. #include <QColor>
  19. #include <QMessageBox>
  20. #include <QTimer>
  21. #include <math.h>
  22. #include <QLCDNumber>
  23. #include <QLabel>
  24. class MaFenetre : public QWidget
  25. {
  26.     Q_OBJECT
  27.     public:
  28.     MaFenetre();
  29.     void afficherDisques();
  30.     void deplacer(int,int);
  31.     void hanoi(int,int,int,int);
  32.     void solution();
  33.     void han();
  34.     void hann();
  35.     public slots:
  36.     void ouvrirDialogue();
  37.     void deplacer111();
  38.     void deplacerAB();
  39.     void deplacerAC();
  40.     void deplacerBA();
  41.     void deplacerBC();
  42.     void deplacerCA();
  43.     void deplacerCB();
  44.     void sol();
  45.     void paintEvent(QPaintEvent*);
  46.     private:
  47.     QPushButton *m_boutonDialogue;
  48.     QPushButton *m_solution;
  49.     QPushButton *m_suivant;
  50.     QPushButton *m_AB;
  51.     QPushButton *m_AC;
  52.     QPushButton *m_BA;
  53.     QPushButton *m_BC;
  54.     QPushButton *m_CA;
  55.     QPushButton *m_CB;
  56. QPushButton *bouton;
  57.     int         m_nbdisques;
  58.     int         m_A;
  59.     int         m_B;
  60.     int         m_C;
  61.     int         m_axA[10];
  62.     int         m_axB[10];
  63.     int         m_axC[10];
  64.     QRectF      disque[10];
  65.     int axe1;
  66.     int axe2;
  67.     int axe3;
  68.      int   *tableau;
  69.      QTimer *timer;
  70.     int comp;
  71.     int cmp;
  72.     int n;
  73. };
  74. #endif


MaFenetre.cpp :

Code :
  1. #include "MaFenetre.h"
  2. MaFenetre::MaFenetre() : QWidget() {
  3.     m_nbdisques=0;
  4.     setFixedSize(1000, 600);
  5.     m_boutonDialogue = new QPushButton("DEBUT", this);
  6.     m_AB = new QPushButton("vers B", this);
  7.     m_AC = new QPushButton("vers C", this);
  8.     m_BA = new QPushButton("vers A", this);
  9.     m_BC = new QPushButton("vers C", this);
  10.     m_CA = new QPushButton("vers A", this);
  11.     m_CB = new QPushButton("vers B", this);
  12.     m_solution= new QPushButton("solution",this);
  13.     m_solution->move(150,50);
  14.     m_AB->move(165,500);
  15.     m_AC->move(165,530);
  16.     m_BA->move(465,500);
  17.     m_BC->move(465,530);
  18.     m_CA->move(765,500);
  19.     m_CB->move(765,530);
  20.     m_boutonDialogue->move(40, 50);
  21.         for(int i=0;i<10;i++)
  22.         {m_axA[i]=i;
  23.         m_axB[i]=10;
  24.         m_axC[i]=10;
  25.         }
  26.     QObject::connect(m_boutonDialogue, SIGNAL(clicked()), this, SLOT(ouvrirDialogue()));
  27.     QObject::connect(m_AB, SIGNAL(clicked()), this, SLOT(deplacerAB()));
  28.     QObject::connect(m_AC, SIGNAL(clicked()), this, SLOT(deplacerAC()));
  29.     QObject::connect(m_BA, SIGNAL(clicked()), this, SLOT(deplacerBA()));
  30.     QObject::connect(m_BC, SIGNAL(clicked()), this, SLOT(deplacerBC()));
  31.     QObject::connect(m_CA, SIGNAL(clicked()), this, SLOT(deplacerCA()));
  32.     QObject::connect(m_CB, SIGNAL(clicked()), this, SLOT(deplacerCB()));
  33.     QObject::connect(m_solution, SIGNAL(clicked()), this, SLOT(deplacer111()));
  34.     comp=0;
  35.     cmp=0;
  36.     axe1=0;
  37.     axe2=0;
  38.     axe3=0;
  39.      tableau = new int[2046];
  40.     for(int j=0;j<2046;j++)
  41.     tableau[j]=0;
  42.    QLabel *label = new QLabel("Salut", this);
  43.     label->move(30, 20);
  44. }
  45. void MaFenetre::ouvrirDialogue() {
  46.     m_nbdisques = QInputDialog::getInteger(this, "Nombres de disques", "Entrez le nombre de disques",5,1,10);
  47.     m_A = m_nbdisques;
  48.     m_B=0;
  49.     m_C=0;
  50. }
  51. void MaFenetre::afficherDisques()
  52. {
  53.     for(int j=0;j<10;j++)
  54.       disque[j] =QRectF(50+10*j,480-20*j,300-20*j,20);
  55.     update();
  56. }
  57. void MaFenetre::deplacerAB()
  58. {
  59.    if(m_A!=0)
  60.    {
  61.        if(m_B==0)
  62.        {    m_axB[0]=m_axA[m_A-1];
  63.             QPointF po(500,490);
  64.             disque[m_axA[m_A-1]].moveCenter(po);
  65.             m_A--;
  66.             m_B++;
  67.        }
  68.        else if(m_axB[m_B-1]<m_axA[m_A-1])
  69.       { m_axB[m_B]=m_axA[m_A-1];
  70.         QPointF pt(500,490-m_B*20);
  71.         disque[m_axB[m_B]].moveCenter(pt);
  72.         m_A--;
  73.         m_B++;
  74.        }
  75. else  QMessageBox::critical(this,"tour de hanoii","deplacement non autorise" );
  76.    }
  77.        update();
  78.     }
  79. void MaFenetre::deplacerAC()
  80. {
  81.    if(m_A!=0)
  82.    {
  83.        if(m_C==0)
  84.        {    m_axC[0]=m_axA[m_A-1];
  85.             QPointF po(800,490);
  86.             disque[m_axA[m_A-1]].moveCenter(po);
  87.             m_A--;
  88.             m_C++;
  89.        }
  90.        else if(m_axC[m_C-1]<m_axA[m_A-1])
  91.       {
  92.           m_axC[m_C]=m_axA[m_A-1];
  93.         QPointF pt(800,490-m_C*20);
  94.         disque[m_axC[m_C]].moveCenter(pt);
  95.         m_A--;
  96.         m_C++;
  97.       }
  98.        else  QMessageBox::critical(this,"tour de hanoii","deplacement non autorise" );
  99.    }
  100.        update();
  101.     }
  102. void MaFenetre::deplacerBA()
  103. {
  104.    if(m_B!=0)
  105.    {
  106.        if(m_A==0)
  107.        {    m_axA[0]=m_axB[m_B-1];
  108.             QPointF po(200,490);
  109.             disque[m_axB[m_B-1]].moveCenter(po);
  110.             m_B--;
  111.             m_A++;
  112.        }
  113.        else if(m_axA[m_A-1]<m_axB[m_B-1])
  114.       { m_axA[m_A]=m_axB[m_B-1];
  115.         QPointF pt(200,490-m_A*20);
  116.         disque[m_axA[m_A]].moveCenter(pt);
  117.         m_B--;
  118.         m_A++;
  119.        }
  120.       else  QMessageBox::critical(this,"tour de hanoii","deplacement non autorise" );
  121.    }
  122.        update();
  123.     }
  124. void MaFenetre::deplacerBC()
  125. {
  126.    if(m_B!=0)
  127.    {
  128.        if(m_C==0)
  129.        {    m_axC[0]=m_axB[m_B-1];
  130.             QPointF po(800,490);
  131.             disque[m_axB[m_B-1]].moveCenter(po);
  132.             m_B--;
  133.             m_C++;
  134.        }
  135.        else if(m_axC[m_C-1]<m_axB[m_B-1])
  136.       { m_axC[m_C]=m_axB[m_B-1];
  137.         QPointF pt(800,490-m_C*20);
  138.         disque[m_axC[m_C]].moveCenter(pt);
  139.         m_B--;
  140.         m_C++;
  141.        }
  142. else  QMessageBox::critical(this,"tour de hanoii","deplacement non autorise" );
  143.    }
  144.        update();
  145.     }
  146. void MaFenetre::deplacerCA()
  147. {
  148.    if(m_C!=0)
  149.    {
  150.        if(m_A==0)
  151.        {    m_axA[0]=m_axC[m_C-1];
  152.             QPointF po(200,490);
  153.             disque[m_axC[m_C-1]].moveCenter(po);
  154.             m_C--;
  155.             m_A++;
  156.        }
  157.        else if(m_axA[m_A-1]<m_axC[m_C-1])
  158.       { m_axA[m_A]=m_axC[m_C-1];
  159.         QPointF pt(200,490-m_A*20);
  160.         disque[m_axA[m_A]].moveCenter(pt);
  161.         m_C--;
  162.         m_A++;
  163.        }
  164. else  QMessageBox::critical(this,"tour de hanoii","deplacement non autorise" );
  165.    }
  166.        update();
  167.     }
  168. void MaFenetre::deplacerCB()
  169. {
  170.    if(m_C!=0)
  171.    {
  172.        if(m_B==0)
  173.        {    m_axB[0]=m_axC[m_C-1];
  174.             QPointF po(500,490);
  175.             disque[m_axC[m_C-1]].moveCenter(po);
  176.             m_C--;
  177.             m_B++;
  178.        }
  179.        else if(m_axB[m_B-1]<m_axC[m_C-1])
  180.       { m_axB[m_B]=m_axC[m_C-1];
  181.         QPointF pt(500,490-m_B*20);
  182.         disque[m_axB[m_B]].moveCenter(pt);
  183.         m_C--;
  184.         m_B++;
  185.        }
  186. else  QMessageBox::critical(this,"tour de hanoii","deplacement non autorise" );
  187.    }
  188.        update();
  189.     }
  190. void MaFenetre::deplacer111()
  191. {
  192. hanoi(m_nbdisques,1,3,2);
  193.     for(int j=0;j<10;j++)
  194.     {QPointF po(200,490-20*j);
  195.     disque[j].moveCenter(po);
  196.     update();
  197.     }
  198.     m_A=m_nbdisques;
  199.     m_B=0;
  200.     m_C=0;
  201.     for(int i=0;i<10;i++)
  202.         {m_axA[i]=i;
  203.         m_axB[i]=10;
  204.         m_axC[i]=10;
  205.         }
  206. solution();
  207. }
  208. void MaFenetre::hanoi(int n,int axe1,int axe2,int axe3)
  209. {
  210. if(n==1)
  211. deplacer(axe1,axe2);
  212. else
  213. {
  214. hanoi(n-1,axe1,axe3,axe2);
  215. deplacer(axe1,axe2);
  216. hanoi(n-1,axe3,axe2,axe1);
  217. }
  218. }
  219. void MaFenetre::solution()
  220. {
  221.     if((tableau[cmp]==1)&&(tableau[cmp+1]==2))
  222.     deplacerAB();
  223.     if((tableau[cmp]==1)&&(tableau[cmp+1]==3))
  224.     deplacerAC();
  225.     if((tableau[cmp]==2)&&(tableau[cmp+1]==1))
  226.     deplacerBA();
  227.     if((tableau[cmp]==2)&&(tableau[cmp+1]==3))
  228.     deplacerBC();
  229.     if((tableau[cmp]==3)&&(tableau[cmp+1]==1))
  230.     deplacerCA();
  231.     if((tableau[cmp]==3)&&(tableau[cmp+1]==2))
  232.     deplacerCB();
  233.      QTimer *timer = new QTimer(this);
  234.      connect(timer, SIGNAL(timeout()), this, SLOT(sol()));
  235.     timer->stop();
  236.      timer->start(1000);
  237. cmp=cmp+2;
  238. }
  239. void MaFenetre::sol()
  240. {if(cmp<pow(2,m_nbdisques)*2)
  241.    { solution();
  242.    }
  243. }
  244. void MaFenetre::deplacer(int x,int y)
  245. {
  246. tableau[comp]=x;
  247. tableau[comp+1]=y;
  248. comp=comp+2;
  249.     if((x==1)&&(y==2))
  250.     deplacerAB();
  251.     if((x==1)&&(y==3))
  252.     deplacerAC();
  253.     if((x==2)&&(y==1))
  254.     deplacerBA();
  255.     if((x==2)&&(y==3))
  256.     deplacerBC();
  257.     if((x==3)&&(y==1))
  258.     deplacerCA();
  259.     if((x==3)&&(y==2))
  260.     deplacerCB();
  261. }
  262. void MaFenetre::paintEvent(QPaintEvent*)
  263. {
  264.       QPainter paintEvent(this);
  265.     for(int i=0;i<m_nbdisques;i++)
  266.     {
  267.         QBrush brush;
  268.         brush.setColor(Qt::blue);
  269.  if(i==0)
  270.         brush.setStyle(Qt::SolidPattern);
  271.  if(i==1)
  272.   brush.setStyle(Qt::Dense1Pattern);
  273.  if(i==2)
  274.   brush.setStyle(Qt::Dense2Pattern);
  275.  if(i==3)
  276.  brush.setStyle(Qt::Dense3Pattern);
  277.  if(i==4)
  278.   brush.setStyle(Qt::Dense4Pattern);
  279.  if(i==5)
  280.   brush.setStyle(Qt::Dense5Pattern);
  281.  if(i==6)
  282.   brush.setStyle(Qt::Dense6Pattern);
  283.  if(i==7)
  284.   brush.setStyle(Qt::Dense7Pattern);
  285.  if(i==8)
  286.   brush.setStyle(Qt::VerPattern);
  287.  if(i==9)
  288.   brush.setStyle(Qt::HorPattern);
  289.  paintEvent.setBrush(brush);
  290.     paintEvent.drawRect(disque[i]);
  291.     }
  292.     QRectF ax1(190,300,20,200);
  293.     QRectF ax2(490,300,20,200);
  294.     QRectF ax3(790,300,20,200);
  295.     QVector<QRectF> axes;
  296.     axes << ax1 << ax2 << ax3 ;
  297.     QPainter myPainter(this);
  298.     myPainter.setBrush(Qt::gray);
  299.     myPainter.drawRects(axes);
  300. }

mood
Publicité
Posté le 30-08-2008 à 17:19:48  profilanswer
 

n°1780864
Malkav
Posté le 01-09-2008 à 10:58:20  profilanswer
 

bon j'ai lu super vite en diagonale j'avoue mais dans solution() tu fait bien plusieurs déplacement à la fois, d'où tes déplacements en "bloc", je me trompe ?
(là de suite je n'ai pas le temps de creuse désolé, mais soit c'est normal de faire plusieurs déplacements à la fois et il faut peut être ajouter une tempo entre deux tests si l'un est positif, soit ce sont des "else if" et pas des "if"


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

  tour de hanoi(algorithme recursif)

 

Sujets relatifs
Algorithmeaidez moi pour resoudre cet algorithme
algorithme de gravitationAlgorithme de graphe, help, prise de tête!!
Erreur dans mon algorithmealgorithme de permutation et rotation cyclik
Algorithme permutationAlgorithme pour regrouper plein de petites images en une grosse
Tri à bulle (forme recursif)!!!!!!!Aide algorithme Ladder (situation industrielle)
Plus de sujets relatifs à : tour de hanoi(algorithme recursif)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR