Пример #1
0
/* 
 * 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)
Пример #2
0
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);
		}
	}
}
Пример #3
0
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);
		}*/
	}
Пример #4
0
void verifyValue24(const char *name, int *a, int index, int value) {
  if (!verifyValue(name, a, index, value, "test1_24", "array variables")) {
    test_failed = TRUE;
  }
}