tour de hanoi(algorithme recursif)

tour de hanoi(algorithme recursif) - C++ - Programmation

Marsh Posté le 30-08-2008 à 17:19:48    

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

Reply

Marsh Posté le 30-08-2008 à 17:19:48   

Reply

Marsh Posté le 01-09-2008 à 10:58:20    

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"

Reply

Sujets relatifs:

Leave a Replay

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