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; }
// 检查从当前局面开始是否能够得到最终合法有效的解 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; }
/** * 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); }