/[projects]/queensgui/src/queensmain.cpp
ViewVC logotype

Annotation of /queensgui/src/queensmain.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5 - (hide annotations) (download)
Fri Jul 20 01:22:53 2007 UTC (16 years, 10 months ago) by torben
File size: 9108 byte(s)
Now the Solution abstraction works !

1 torben 1 /***************************************************************************
2     * Copyright (C) 2005 by Torben Nielsen *
3     * torben@t-hoerup.dk *
4     * *
5     * This program is free software; you can redistribute it and/or modify *
6     * it under the terms of the GNU General Public License as published by *
7     * the Free Software Foundation; either version 2 of the License, or *
8     * (at your option) any later version. *
9     * *
10     * This program is distributed in the hope that it will be useful, *
11     * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13     * GNU General Public License for more details. *
14     * *
15     * You should have received a copy of the GNU General Public License *
16     * along with this program; if not, write to the *
17     * Free Software Foundation, Inc., *
18     * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19     ***************************************************************************/
20     #include <qapplication.h>
21     #include <qlabel.h>
22     #include <qlayout.h>
23     #include <qlistbox.h>
24     #include <qpopupmenu.h>
25     #include <qpushbutton.h>
26     #include <qspinbox.h>
27     #include <qstring.h>
28    
29    
30 torben 2
31 torben 1 #include "queensmain.h"
32     #include "board.h"
33     #include "queens.h"
34 torben 5
35 torben 2 #include "solution.h"
36 torben 5 #include "solutionmatrix.h"
37     #include "solutionint.h"
38 torben 1
39 torben 4 #include "containervector.h"
40     #include "containerlist.h"
41     #include "containerhash.h"
42     #include "containermnvector.h"
43    
44 torben 1 #include "config.h"
45    
46 torben 2
47 torben 5
48 torben 1 QueensMain::QueensMain(QWidget *parent, const char *name)
49     : QDialog(parent, name)
50     {
51     QVBoxLayout *mainlayout = new QVBoxLayout( this );
52    
53     m_board = new Board( this );
54    
55     m_start = new QPushButton("Start", this);
56     m_quit = new QPushButton("Quit", this);
57     m_stop = new QPushButton("Stop", this);
58     m_stop->setEnabled( false );
59    
60     QHBoxLayout *upperlayout = new QHBoxLayout( mainlayout );
61     QVBoxLayout *left = new QVBoxLayout( upperlayout );
62    
63     upperlayout->add( m_board );
64     m_list = new QListBox( this );
65    
66     m_list->setMinimumWidth( 180 );
67     m_sizeSelector = new QSpinBox( this );
68     m_status = new QLabel( this );
69    
70     left->add( m_list );
71     left->add( m_sizeSelector );
72    
73     QHBoxLayout *buttons = new QHBoxLayout( mainlayout );
74     buttons->add( m_start );
75     buttons->add( m_stop );
76     buttons->add( m_quit );
77    
78     mainlayout->add( m_status );
79    
80     m_sizeSelector->setMinValue( MIN_SIZE );
81     m_sizeSelector->setMaxValue( MAX_SIZE );
82     m_sizeSelector->setValue( 8 );
83     m_board->setSize( 8 );
84    
85 torben 2 m_storage = StorageMatrix;
86 torben 1 m_sortalgo = SortList;
87     m_solutions = NULL;
88     m_queens = NULL;
89 torben 4 m_sol = NULL;
90 torben 1
91     connect(m_quit,
92     SIGNAL( clicked() ),
93     qApp,
94     SLOT( quit() )
95     );
96    
97     connect(m_sizeSelector,
98     SIGNAL( valueChanged(int) ),
99     this,
100     SLOT( resize(int) )
101     );
102    
103     connect(m_start,
104     SIGNAL( clicked() ),
105     this,
106     SLOT( start() )
107     );
108    
109     connect(m_stop,
110     SIGNAL( clicked() ),
111     this,
112     SLOT( stop() )
113     );
114    
115     connect(m_list,
116     SIGNAL( selectionChanged() ),
117     this,
118     SLOT( showSolution() )
119     );
120    
121     connect( qApp,
122     SIGNAL( lastWindowClosed() ),
123     qApp,
124     SLOT( quit() )
125     );
126     }
127    
128    
129     QueensMain::~QueensMain()
130     {
131     delete m_board;
132     }
133    
134     void QueensMain::start()
135     {
136     m_sizeSelector->setEnabled( false );
137     m_start->setEnabled( false );
138     m_stop->setEnabled( true );
139     m_list->clear();
140     m_status->setText( QString("Searching ...") );
141    
142     if (m_queens != NULL) {
143     m_queens->wait();
144     delete m_queens;
145     }
146    
147     if (m_solutions != NULL)
148     delete m_solutions;
149     switch (m_sortalgo) {
150     case SortList:
151 torben 4 m_solutions = new ContainerList(this);
152 torben 1 break;
153     case SortVector:
154 torben 4 m_solutions = new ContainerVector(this);
155 torben 1 break;
156     case SortHash:
157 torben 4 m_solutions = new ContainerHash(this);
158 torben 1 break;
159     case SortMNVector:
160 torben 4 m_solutions = new ContainerMNVector(this);
161 torben 1 break;
162     }
163 torben 2
164     if (m_sol != NULL)
165     delete m_sol;
166    
167     switch(this->m_storage) {
168     case StorageInt:
169 torben 5 m_sol = new SolutionInt(m_sizeSelector->value());
170 torben 2 break;
171     case StorageMatrix:
172 torben 5 m_sol = new SolutionMatrix(m_sizeSelector->value());
173 torben 2 break;
174     }
175 torben 1
176 torben 2
177 torben 1 m_elapsed.start();
178     m_time.start();
179 torben 4 m_queens = new Queens(this, m_sol, m_solutions, m_sizeSelector->value() ,false);
180 torben 1 m_queens->start();
181     }
182    
183     void QueensMain::stop()
184     {
185     m_solutions->halt();
186     m_queens->stop();
187     m_queens->wait();
188    
189     int num = m_solutions->numSolutions();
190     m_status->setText( QString("Aborted. Found ") + QString::number(num,10).append(" solutions") );
191     m_list->clear();
192     for (int i=1; i<=num; i++)
193     m_list->insertItem( QString("Solution no ") + QString::number(i,10), i);
194    
195     delete m_queens;
196     m_queens = NULL;
197    
198     m_list->setEnabled( true );
199     m_sizeSelector->setEnabled( true );
200     m_start->setEnabled( true );
201     m_stop->setEnabled( false );
202     }
203    
204     void QueensMain::foundSolution()
205     {
206     int num = m_solutions->numSolutions();
207     if (m_elapsed.elapsed() > 500)
208     {
209     m_status->setText( QString("Searching ... found ") + QString::number(num,10).append(" solutions") );
210     m_elapsed.restart();
211     }
212     }
213    
214     void QueensMain::finishedSearch()
215     {
216     uniqueSolutions();
217     m_sizeSelector->setEnabled( true );
218     m_start->setEnabled( true );
219     m_stop->setEnabled( false );
220     }
221    
222    
223     void QueensMain::showSolution()
224     {
225     int index = m_list->currentItem();
226 torben 2 Solution* sol = m_solutions->solution( index );
227 torben 4 m_board->setMatrix( sol );
228 torben 1 }
229    
230     void QueensMain::resize(int size)
231     {
232     m_board->setSize( size );
233     m_board->repaint( true );
234     m_list->clear();
235     }
236    
237     QString QueensMain::elapsed()
238     {
239     int time = m_time.elapsed();
240     int msec = time % 1000;
241     int sec = time / 1000;
242     int min = sec / 60;
243     sec %= 60;
244     QString smsec = (QString::number(msec)).rightJustify(3, '0');
245     QString ssec = (QString::number(sec)).rightJustify(2,'0');
246    
247     QString res;
248     if (min!=0)
249     res = QString("%1:%2.%3").arg(min).arg(ssec).arg(smsec);
250     else
251     res = QString("%1.%2").arg(sec).arg(smsec);
252     return res;
253     }
254    
255     void QueensMain::uniqueSolutions()
256     {
257     m_totalcount = m_solutions->numSolutions();
258     m_status->setText( QString("sorting ") + QString::number(m_totalcount,10).append(" solutions...") );
259    
260     m_elapsed.restart();
261     m_solutions->uniqueSolutions();
262    
263     int uniq = m_solutions->numSolutions();
264    
265    
266     QString msg;
267     msg = QString( "Found %1 unique solutions, of %2 total solutions. Time elapsed: %3" ).arg(uniq).arg(m_totalcount).arg( elapsed() );
268    
269     m_list->clear();
270     for (int i=1; i<=uniq; i++)
271     m_list->insertItem( QString("Unique solution no ") + QString::number(i,10), i);
272    
273     m_status->setText( msg );
274     }
275    
276     void QueensMain::contextMenuEvent( QContextMenuEvent *event)
277     {
278     QPopupMenu *contextMenu = new QPopupMenu( this );
279     contextMenu->setCheckable( true );
280 torben 2 QLabel *sortCaption = new QLabel("<b><i>Sort algorithm</i></b>", this);
281     sortCaption->setAlignment( Qt::AlignCenter );
282     contextMenu->insertItem( sortCaption );
283 torben 1
284     contextMenu->insertItem("List", this, SLOT( sortList() ), 0, 1);
285     contextMenu->insertItem("Vector", this, SLOT( sortVector() ), 0, 2);
286     contextMenu->insertItem("Hash", this, SLOT( sortHash() ), 0, 3);
287     contextMenu->insertItem("M*N Vector", this, SLOT(sortMNVector()), 0, 4);
288 torben 2
289     QLabel *storageCaption = new QLabel("<b><i>Storage class</i></b>", this);
290     contextMenu->insertItem( storageCaption );
291     contextMenu->insertItem("Matrix Solution", this, SLOT( storageMatrix() ), 0, 5);
292     contextMenu->insertItem("Int Solution", this, SLOT( storageInt() ), 0, 6);
293 torben 1
294 torben 2
295 torben 1 switch (m_sortalgo) {
296     case SortList:
297     contextMenu->setItemChecked( 1, true);
298     break;
299     case SortVector:
300     contextMenu->setItemChecked( 2, true);
301     break;
302     case SortHash:
303     contextMenu->setItemChecked( 3, true);
304     break;
305     case SortMNVector:
306     contextMenu->setItemChecked( 4, true);
307     break;
308     }
309    
310 torben 2 switch (m_storage) {
311     case StorageMatrix:
312     contextMenu->setItemChecked(5, true);
313     break;
314     case StorageInt:
315     contextMenu->setItemChecked(6, true);
316     break;
317     }
318    
319    
320 torben 1 contextMenu->exec( event->globalPos() );
321     delete contextMenu;
322     }
323    
324     void QueensMain::duplicateRemoved()
325     {
326     if (m_elapsed.elapsed() > 500)
327     {
328     int uniq = m_solutions->getUniqueRemoved();
329     QString status;
330     status = QString ("Sorting %1 solutions. So far identified %2 duplicates").arg(m_totalcount).arg(uniq);
331     m_status->setText(status);
332     m_elapsed.restart();
333     }
334     }
335    
336     void QueensMain::sortList()
337     {
338     m_sortalgo = SortList;
339     }
340    
341     void QueensMain::sortVector()
342     {
343     m_sortalgo = SortVector;
344     }
345    
346     void QueensMain::sortHash()
347     {
348     m_sortalgo = SortHash;
349     }
350    
351     void QueensMain::sortMNVector()
352     {
353     m_sortalgo = SortMNVector;
354     }
355    
356 torben 2 void QueensMain::storageInt()
357     {
358     m_storage = StorageInt;
359     }
360    
361     void QueensMain::storageMatrix()
362     {
363     m_storage = StorageMatrix;
364     }

Properties

Name Value
svn:eol-style native
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.20