Select Git revision
vnc-testbild.tex
Forked from
Peter Gerwinski / Online-Werkzeuge
Source project has a limited visibility.
window.cpp 3.93 KiB
#include "window.h"
#include <QApplication>
#include <QStandardPaths>
#include <QDebug>
#include <QThread>
#include <QProgressBar>
#include <QSlider>
Window::Window(QWidget *parent)
: QWidget{parent}
{
setFixedWidth(1600);
m_button = new QPushButton("solve", this);
connect(m_button, SIGNAL(clicked()), this, SLOT(solveButtonClicked()));
m_button->setGeometry(1200, height() - 30, width() - 1200, 30);
m_slider = new QSlider(this);
m_slider->setRange(0,1000);
m_slider->setOrientation(Qt::Horizontal);
m_slider->setValue(m_delay);
m_slider->setGeometry(1200, height() - 60, width() - 1200, 30);
connect(m_slider,SIGNAL(valueChanged(int)),this,SLOT(setValue(int)));
int dx = 0;
int dy = 0;
for (int x = 0; x < 9; x++)
{
for (int y = 0; y < 9; y++)
{
if (x == 3)
dx = 4;
if (x == 6)
dx = 8;
if (y < 3)
dy = 0;
if (y >= 3)
dy = 4;
if (y >= 6)
dy = 8;
m_cell[x+y*9].setParent(this);
m_cell[x+y*9].setGeometry(x * 100 + dx, y * 100 + dy, 100, 100);
/* code */
}
}
// init signals
for (int x = 0; x < 9; x++)
{
for (int y = 0; y < 9; y++)
{
for (int d = 0; d < 9; d++) //rows and columns
{
connect(&m_cell[x+y*9], SIGNAL(update(int)), &m_cell[x+d*9], SLOT(removeOption(int)));
connect(&m_cell[x+y*9], SIGNAL(update(int)), &m_cell[d+y*9], SLOT(removeOption(int)));
connect(&m_cell[x+y*9], SIGNAL(undo(int)), &m_cell[x+d*9], SLOT(addOption(int)));
connect(&m_cell[x+y*9], SIGNAL(undo(int)), &m_cell[d+y*9], SLOT(addOption(int)));
}
int a = x / 3 * 3;
int b = y / 3 * 3;
for (int x1 = a; x1 < a + 3; x1++) //square
{
for (int y1 = b; y1 < b + 3; y1++)
{
connect(&m_cell[x+y*9], SIGNAL(update(int)), &m_cell[x1+y1*9], SLOT(removeOption(int)));
connect(&m_cell[x+y*9], SIGNAL(undo(int)), &m_cell[x1+y1*9], SLOT(addOption(int)));
}
}
}
}
}
void Window::solveButtonClicked()
{
// std::array<Cell,81> start = m_cell;
std::list<Cell*> hist;
srand(time(NULL));
while (1)
{
std::vector<Cell *> b; //vector of cells with least entropy
int minEtropy = 10;
for (int x = 0; x < 9; x++) //loop through all cells and fill list b --> this could be optimzed
{
for (int y = 0; y < 9; y++)
{
if (m_cell[x+y*9].collapsed)
continue;
else if (m_cell[x+y*9].possibleStates < minEtropy)
{
minEtropy = m_cell[x+y*9].possibleStates;
b.clear();
b.push_back(&m_cell[x+y*9]);
}
else if (m_cell[x+y*9].possibleStates == minEtropy)
{
b.push_back(&m_cell[x+y*9]);
}
}
}
if (b.size() == 0) //if b is empty -> solved
{
qInfo("Solved!!");
return;
}
else if(minEtropy ==0){
while (hist.size()>1)
{
hist.back()->un();
hist.pop_back();
}
return;
//solveButtonClicked();
}
int choiceCell = rand() % b.size(); //choose a random cell
int choiceNr = rand() % b[choiceCell]->index.size(); //choose a random number;
b[choiceCell]->collapse(b[choiceCell]->index[choiceNr]); //collapse that random cell with chosen number;
hist.push_back(b[choiceCell]);
repaint(); //draw cells again
QThread::msleep(m_delay);
}
// qInfo("%d---:)");
}
void Window::setValue(int s){
m_delay = s;
return;
}