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

Annotation of /queensgui/src/queensmain.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 7 - (hide annotations) (download)
Fri Jul 20 13:50:47 2007 UTC (16 years, 10 months ago) by torben
File size: 9236 byte(s)
Fixed some memleaks

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 torben 7
133     if (m_solutions != NULL)
134     delete m_solutions;
135     if (m_sol != NULL)
136     delete m_sol;
137 torben 1 }
138    
139     void QueensMain::start()
140     {
141     m_sizeSelector->setEnabled( false );
142     m_start->setEnabled( false );
143     m_stop->setEnabled( true );
144     m_list->clear();
145     m_status->setText( QString("Searching ...") );
146    
147 torben 6 m_board->setMatrix(0);
148    
149 torben 1 if (m_queens != NULL) {
150     m_queens->wait();
151     delete m_queens;
152 torben 7 m_queens = 0;
153 torben 1 }
154    
155     if (m_solutions != NULL)
156     delete m_solutions;
157     switch (m_sortalgo) {
158     case SortList:
159 torben 4 m_solutions = new ContainerList(this);
160 torben 1 break;
161     case SortVector:
162 torben 4 m_solutions = new ContainerVector(this);
163 torben 1 break;
164     case SortHash:
165 torben 4 m_solutions = new ContainerHash(this);
166 torben 1 break;
167     case SortMNVector:
168 torben 4 m_solutions = new ContainerMNVector(this);
169 torben 1 break;
170     }
171 torben 2
172     if (m_sol != NULL)
173     delete m_sol;
174    
175     switch(this->m_storage) {
176     case StorageInt:
177 torben 5 m_sol = new SolutionInt(m_sizeSelector->value());
178 torben 2 break;
179     case StorageMatrix:
180 torben 5 m_sol = new SolutionMatrix(m_sizeSelector->value());
181 torben 2 break;
182     }
183 torben 1
184 torben 2
185 torben 1 m_elapsed.start();
186     m_time.start();
187 torben 4 m_queens = new Queens(this, m_sol, m_solutions, m_sizeSelector->value() ,false);
188 torben 1 m_queens->start();
189     }
190    
191     void QueensMain::stop()
192     {
193     m_solutions->halt();
194     m_queens->stop();
195     m_queens->wait();
196    
197     int num = m_solutions->numSolutions();
198     m_status->setText( QString("Aborted. Found ") + QString::number(num,10).append(" solutions") );
199     m_list->clear();
200     for (int i=1; i<=num; i++)
201     m_list->insertItem( QString("Solution no ") + QString::number(i,10), i);
202    
203     delete m_queens;
204     m_queens = NULL;
205    
206     m_list->setEnabled( true );
207     m_sizeSelector->setEnabled( true );
208     m_start->setEnabled( true );
209     m_stop->setEnabled( false );
210     }
211    
212     void QueensMain::foundSolution()
213     {
214     int num = m_solutions->numSolutions();
215     if (m_elapsed.elapsed() > 500)
216     {
217     m_status->setText( QString("Searching ... found ") + QString::number(num,10).append(" solutions") );
218     m_elapsed.restart();
219     }
220     }
221    
222     void QueensMain::finishedSearch()
223     {
224     uniqueSolutions();
225     m_sizeSelector->setEnabled( true );
226     m_start->setEnabled( true );
227     m_stop->setEnabled( false );
228     }
229    
230    
231     void QueensMain::showSolution()
232     {
233     int index = m_list->currentItem();
234 torben 2 Solution* sol = m_solutions->solution( index );
235 torben 4 m_board->setMatrix( sol );
236 torben 1 }
237    
238     void QueensMain::resize(int size)
239     {
240     m_board->setSize( size );
241     m_board->repaint( true );
242     m_list->clear();
243     }
244    
245     QString QueensMain::elapsed()
246     {
247     int time = m_time.elapsed();
248     int msec = time % 1000;
249     int sec = time / 1000;
250     int min = sec / 60;
251     sec %= 60;
252     QString smsec = (QString::number(msec)).rightJustify(3, '0');
253     QString ssec = (QString::number(sec)).rightJustify(2,'0');
254    
255     QString res;
256     if (min!=0)
257     res = QString("%1:%2.%3").arg(min).arg(ssec).arg(smsec);
258     else
259     res = QString("%1.%2").arg(sec).arg(smsec);
260     return res;
261     }
262    
263     void QueensMain::uniqueSolutions()
264     {
265     m_totalcount = m_solutions->numSolutions();
266     m_status->setText( QString("sorting ") + QString::number(m_totalcount,10).append(" solutions...") );
267    
268     m_elapsed.restart();
269     m_solutions->uniqueSolutions();
270    
271     int uniq = m_solutions->numSolutions();
272    
273    
274     QString msg;
275     msg = QString( "Found %1 unique solutions, of %2 total solutions. Time elapsed: %3" ).arg(uniq).arg(m_totalcount).arg( elapsed() );
276    
277     m_list->clear();
278     for (int i=1; i<=uniq; i++)
279     m_list->insertItem( QString("Unique solution no ") + QString::number(i,10), i);
280    
281     m_status->setText( msg );
282     }
283    
284     void QueensMain::contextMenuEvent( QContextMenuEvent *event)
285     {
286     QPopupMenu *contextMenu = new QPopupMenu( this );
287     contextMenu->setCheckable( true );
288 torben 2 QLabel *sortCaption = new QLabel("<b><i>Sort algorithm</i></b>", this);
289     sortCaption->setAlignment( Qt::AlignCenter );
290     contextMenu->insertItem( sortCaption );
291 torben 1
292     contextMenu->insertItem("List", this, SLOT( sortList() ), 0, 1);
293     contextMenu->insertItem("Vector", this, SLOT( sortVector() ), 0, 2);
294     contextMenu->insertItem("Hash", this, SLOT( sortHash() ), 0, 3);
295     contextMenu->insertItem("M*N Vector", this, SLOT(sortMNVector()), 0, 4);
296 torben 2
297     QLabel *storageCaption = new QLabel("<b><i>Storage class</i></b>", this);
298     contextMenu->insertItem( storageCaption );
299     contextMenu->insertItem("Matrix Solution", this, SLOT( storageMatrix() ), 0, 5);
300     contextMenu->insertItem("Int Solution", this, SLOT( storageInt() ), 0, 6);
301 torben 1
302 torben 2
303 torben 1 switch (m_sortalgo) {
304     case SortList:
305     contextMenu->setItemChecked( 1, true);
306     break;
307     case SortVector:
308     contextMenu->setItemChecked( 2, true);
309     break;
310     case SortHash:
311     contextMenu->setItemChecked( 3, true);
312     break;
313     case SortMNVector:
314     contextMenu->setItemChecked( 4, true);
315     break;
316     }
317    
318 torben 2 switch (m_storage) {
319     case StorageMatrix:
320     contextMenu->setItemChecked(5, true);
321     break;
322     case StorageInt:
323     contextMenu->setItemChecked(6, true);
324     break;
325     }
326    
327    
328 torben 1 contextMenu->exec( event->globalPos() );
329     delete contextMenu;
330     }
331    
332     void QueensMain::duplicateRemoved()
333     {
334     if (m_elapsed.elapsed() > 500)
335     {
336     int uniq = m_solutions->getUniqueRemoved();
337     QString status;
338     status = QString ("Sorting %1 solutions. So far identified %2 duplicates").arg(m_totalcount).arg(uniq);
339     m_status->setText(status);
340     m_elapsed.restart();
341     }
342     }
343    
344     void QueensMain::sortList()
345     {
346     m_sortalgo = SortList;
347     }
348    
349     void QueensMain::sortVector()
350     {
351     m_sortalgo = SortVector;
352     }
353    
354     void QueensMain::sortHash()
355     {
356     m_sortalgo = SortHash;
357     }
358    
359     void QueensMain::sortMNVector()
360     {
361     m_sortalgo = SortMNVector;
362     }
363    
364 torben 2 void QueensMain::storageInt()
365     {
366     m_storage = StorageInt;
367     }
368    
369     void QueensMain::storageMatrix()
370     {
371     m_storage = StorageMatrix;
372     }

Properties

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

  ViewVC Help
Powered by ViewVC 1.1.20