/* * Internal method that recursively solves the puzzle. * * Parameters: * x_cord: The x-coordinate on the board. Should be between 0 * and 8, inclusive * y_cord: The y-coordinate on the board. Should be between 0 * and 8, inclusive. * * Return: * True if solved, false if unsolvable. If solved, the puzzle's * current state is solved. You can print the puzzle to see * the solution. */ bool SudokuPuzzle::solve(int x_cord, int y_cord) { // Only solve piece if not already solved (given) if (board[x_cord][y_cord] != 0) { // If value works, on to next if (verifyValue(x_cord,y_cord)) { // If last piece, puzzle solved! if (x_cord == 8 && y_cord == 8) { return true; } // Find next slot on this row int next_x = x_cord+1; int next_y = y_cord; // If at end of row, start next if (next_x >= 9) { next_x = 0; next_y++; } // Move on to next piece return solve(next_x, next_y); } // Value doesn't work. Early guess is bad else { return false; } } // If value already defined // There isn't a value already for position. // Guess all the values until one works for (int val=1; val<10; val++) { setBoardValue(x_cord, y_cord, val); // If value works, on to next if (verifyValue(x_cord,y_cord)) { // If last piece, puzzle solved! if (x_cord == 8 && y_cord == 8) { return true; } // Find next slot on this row int next_x = x_cord+1; int next_y = y_cord; // If at end of row, start next if (next_x >= 9) { next_x = 0; next_y++; } // Move on to next piece //return solve(next_x, next_y); if (solve(next_x, next_y)) { return true; } } } // Remove value. Going to backtrack. If value remained, // then would think its part of solution. board[x_cord][y_cord] = 0; // If gets here, must backtrack. No solution // for path. return false; } // SudokuPuzzle::solve(int, int)
void TableView3D::hotKeyPressed(int key,Qt::KeyboardModifier modifier) { if (key == Qt::Key_Plus || key == Qt::Key_Equal) { if (ui.tableWidget->selectedItems().size() == 0) { return; } QList<QPair<QPair<int,int>,double> > vallist; QList<QString> invalidreasons; bool valid = true; for (int i=0;i<ui.tableWidget->selectedItems().size();i++) { QString text = ui.tableWidget->item(ui.tableWidget->selectedItems()[i].y(),ui.tableWidget->selectedItems()[i].x()); double textd = text.toDouble(); double maxval = 0; maxval = tableData->maxCalcedValue(); if (modifier & Qt::ShiftModifier) { textd += maxval / 10; } else { textd += maxval / 100; } if (textd > maxval) { textd = maxval; } QPair<QPair<int,int>,double> val; val.first = QPair<int,int>(ui.tableWidget->selectedItems()[i].y(),ui.tableWidget->selectedItems()[i].x()); val.second = textd; vallist.append(val); //else if (column == 0) Y //else Z QString formattednumber = ""; if (ui.tableWidget->selectedItems()[i].x() == -1) { //Y axis formattednumber = formatNumber(textd,m_metaData.yDp); } else if (ui.tableWidget->selectedItems()[i].y() == -1) { //X Axis formattednumber = formatNumber(textd,m_metaData.xDp); } else { //Value formattednumber = formatNumber(textd,m_metaData.zDp); } QString verifystr = verifyValue(ui.tableWidget->selectedItems()[i].y(),ui.tableWidget->selectedItems()[i].x(),formattednumber); if (verifystr != "GOOD") { invalidreasons.append(verifystr); valid = false; } else { ui.tableWidget->setItem(ui.tableWidget->selectedItems()[i].y(),ui.tableWidget->selectedItems()[i].x(),formattednumber); } //ui.tableWidget->selectedItems()[0]->setText(formatNumber(textd,m_metaData.zDp)); //setValue(ui.tableWidget->selectedItems()[i]->row(),ui.tableWidget->selectedItems()[i]->column(),textd); } if (!valid) { //We had an error. m_inputTimer->stop(); QMessageBox::information(0,"Error setting value: ",invalidreasons.at(0)); setRange(m_queuedValList); } if (m_inputTimer->isActive()) { //Timer is already active, too soon! //Let the table continue to increment... but don't fire off m_queuedValList = vallist; m_firstKeypress = false; //m_inputTimer->stop(); //m_inputTimer->start(250); } else { m_firstKeypress = true; m_inputTimer->start(350); setRange(vallist); } } else if (key == Qt::Key_Minus || key == Qt::Key_Underscore) { if (ui.tableWidget->selectedItems().size() == 0) { return; } QList<QPair<QPair<int,int>,double> > vallist; QList<QString> invalidreasons; bool valid = true; for (int i=0;i<ui.tableWidget->selectedItems().size();i++) { QString text = ""; text = ui.tableWidget->item(ui.tableWidget->selectedItems()[i].y(),ui.tableWidget->selectedItems()[i].x()); double textd = text.toDouble(); double minval = 0; double maxval = 0; maxval = tableData->maxCalcedValue(); minval = tableData->minCalcedValue(); if (modifier & Qt::ShiftModifier) { textd -= maxval / 10; } else { textd -= maxval / 100; } if (textd < minval) { textd = minval; } QPair<QPair<int,int>,double> val; val.first = QPair<int,int>(ui.tableWidget->selectedItems()[i].y(),ui.tableWidget->selectedItems()[i].x()); val.second = textd; vallist.append(val); QString formattednumber = ""; if (ui.tableWidget->selectedItems()[i].x() == -1) { //Y axis formattednumber = formatNumber(textd,m_metaData.yDp); } else if (ui.tableWidget->selectedItems()[i].y() == -1) { //X Axis formattednumber = formatNumber(textd,m_metaData.xDp); } else { //Value formattednumber = formatNumber(textd,m_metaData.zDp); } QString verifystr = verifyValue(ui.tableWidget->selectedItems()[i].y(),ui.tableWidget->selectedItems()[i].x(),formattednumber); if (verifystr != "GOOD") { invalidreasons.append(verifystr); valid = false; } else { ui.tableWidget->setItem(ui.tableWidget->selectedItems()[i].y(),ui.tableWidget->selectedItems()[i].x(),formattednumber); } //ui.tableWidget->selectedItems()[0]->setText(formatNumber(textd,m_metaData.zDp)); //setValue(ui.tableWidget->selectedItems()[0]->row(),ui.tableWidget->selectedItems()[0]->column(),textd); } if (!valid) { //We had an error. m_inputTimer->stop(); QMessageBox::information(0,"Error setting value: ",invalidreasons.at(0)); setRange(m_queuedValList); } if (m_inputTimer->isActive()) { //Timer is already active, too soon! //Let the table continue to increment... but don't fire off m_queuedValList = vallist; m_firstKeypress = false; //m_inputTimer->stop(); //m_inputTimer->start(250); } else { m_firstKeypress = true; m_inputTimer->start(250); setRange(vallist); } } }
void TableView3D::keyPressEvent(QKeyEvent *event) { if(event->key() == Qt::Key_C && event->modifiers() & Qt::ControlModifier) { //Copy if (ui.tableWidget->selectedItems().size() == 0) { return; } QByteArray itembytes; //int row = ui.tableWidget->selectedItems()[0]->row(); QMap<int,QMap<int,QString> > tablemap; int maxrow = 0; int maxcolumn = 0; int minrow = 255; int mincolumn = 255; /*foreach(QTableWidgetItem* item,ui.tableWidget->selectedItems()) { tablemap[item->row()][item->column()] = item->text(); if (item->row() > maxrow) maxrow = item->row(); if (item->column() > maxcolumn) maxcolumn = item->column(); if (item->row() < minrow) minrow = item->row(); if (item->column() < mincolumn) mincolumn = item->column(); }*/ for (int i=minrow;i<=maxrow;i++) { for (int j=mincolumn;j<=maxcolumn;j++) { if (tablemap.contains(i)) { if (tablemap[i].contains(j)) { itembytes.append(tablemap[i][j]); itembytes.append("\t"); } else { itembytes.append("\t"); } } else { //itembytes.append("\n"); } } itembytes = itembytes.mid(0,itembytes.length()-1); itembytes.append("\n"); } QMimeData * mime = new QMimeData(); mime->setData("text/plain",itembytes); QApplication::clipboard()->setMimeData(mime); } else if(event->key() == Qt::Key_V && event->modifiers() & Qt::ControlModifier) { //Paste if (ui.tableWidget->selectedItems().size() == 0) { //Can't paste when we don't know where to paste! return; } if (ui.tableWidget->selectedItems().size() != 1) { QMessageBox::information(0,"Error","Pasting to a selection group is not supported yet. Please select the top left cell you wish to paste from"); return; } int rowindex = ui.tableWidget->selectedItems()[0].y(); int columnindex = ui.tableWidget->selectedItems()[0].x(); int newrow = 0; int newcolumn = 0; QByteArray data = QApplication::clipboard()->mimeData()->data("text/plain"); QString datastring(data); QStringList datastringsplit = datastring.split("\n"); //Check to make sure we're in-bounds first if (datastringsplit.size() + rowindex > ui.tableWidget->rowCount()+1) { QMessageBox::information(0,"Error","Attempted to paste a block that does not fit!"); return; } foreach(QString line,datastringsplit) { if (line.split("\t").size() + columnindex > ui.tableWidget->columnCount()+1) { QMessageBox::information(0,"Error","Attempted to paste a block that does not fit!"); return; } } //Disable signals, so we can write the table all at once //bool valid = true; QMap<int,QMap<int,QString> > tmpvaluemap; QStringList invalidreasons; QList<QPair<QPair<int,int>,double> > valuelist; //setRange foreach(QString line,datastringsplit) { QStringList linesplit = line.split("\t"); foreach (QString item,linesplit) { if (item != "") { if (!tmpvaluemap.contains(rowindex+newrow)) { tmpvaluemap[rowindex+newrow] = QMap<int,QString>(); } //newvallist.append(item.toDouble()); QPair<QPair<int,int>,double> val; val.first = QPair<int,int>(rowindex+newrow,columnindex+newcolumn); val.second = item.toDouble(); valuelist.append(val); //tmpvaluemap[rowindex+newrow][columnindex+newcolumn] = ui.tableWidget->item(rowindex+newrow,columnindex+newcolumn)->text(); QString verifystr = verifyValue(rowindex+newrow,columnindex+newcolumn,item); if (verifystr != "GOOD") { invalidreasons.append(verifystr); //valid = false; } //ui.tableWidget->item(rowindex+newrow,columnindex+newcolumn)->setText(item); } newcolumn++; } newcolumn=0; newrow++; } setRange(valuelist); /* //Write the values, and re-enable the signals. if (valid) { writeTable(true); } else { for (QMap<int,QMap<int,QString> >::const_iterator i=tmpvaluemap.constBegin();i!=tmpvaluemap.constEnd();i++) { for (QMap<int,QString>::const_iterator j=i.value().constBegin();j!=i.value().constEnd();j++) { ui.tableWidget->item(i.key(),j.key())->setText(j.value()); } } QString errorstr = ""; foreach(QString reason,invalidreasons) { errorstr += reason + ","; } QMessageBox::information(0,"Error",errorstr); }*/ }
void verifyValue24(const char *name, int *a, int index, int value) { if (!verifyValue(name, a, index, value, "test1_24", "array variables")) { test_failed = TRUE; } }