示例#1
0
int main(int argc, char* argv[]) {
	while (true) {
		SudokuBoard* board = readBoard(stdin);
		if (board == NULL) {
			break;
		}

		if (!isValidBoard(board)) {
			printf("Invalid board.\n");
			freeSudokuBoard(board);
			continue;
		}

		SudokuBoard* solved = solveBoard(board);

		if (solved == NULL) {
			printf("No solution found.\n");
			freeSudokuBoard(board);
			continue;
		}
		drawSudokuBoardSimple(solved);

		if (solved != board) {
			freeSudokuBoard(solved);
		}
		freeSudokuBoard(board);
	}

	return 0;
}
示例#2
0
 // 检查从当前局面开始是否能够得到最终合法有效的解
 bool solveSudoku(vector<vector<char> >& board) {
     // 如果没有找到空白的格子,说明已经填满了,成功返回
     pair<int, int> pos = findFirstEmpty(board);
     if (pos.first == -1 && pos.second == -1)
         return true;
     // 否则依次尝试往当前格子中填入数字 1-9,并判断能否得到可行的解
     for (int i = 1; i <= 9; ++i) {
         board[pos.first][pos.second] = i + '0';
         if (isValidBoard(board, pos) && solveSudoku(board))
             return true;
         // 恢复原样
         board[pos.first][pos.second] = '.';
     }
     return false;
 }
示例#3
0
/**
 * Returns whether you have a valid, complete board
 */
bool isCompleteBoard(SudokuBoard* board) {
	if (board == NULL) {
		return false;
	}
	// make sure everything is full
	for (int i = 0; i < BOARD_SIZE; i++) {
		for (int j = 0; j < BOARD_SIZE; j++) {
			Tile tile = board->tiles[i][j];
			if (tile.value == 0) {
				return false;
			}
		}
	}

	return isValidBoard(board);
}