您的位置:首页 > 其它

[LeetCode] Sudoku Solver

2014-11-04 09:10 253 查看
Write a program to solve a Sudoku puzzle by filling the empty cells.

Empty cells are indicated by the character
'.'
.

You may assume that there will be only one unique solution.



A sudoku puzzle...



...and its solution numbers marked in red.

终于到了朝思暮想的sudoku solver了, 有了Valid Sudoku的基础,我知道了用哈希表可以很方便的判断冲突。思路还是遍历这个board,这次是找到为空的位置,然后对可能的结果集进行筛选:把行、列、3x3出现的数字都去掉,剩下的就是可能的结果集。然后把结果集里的元素一个一个拿出来进行深度搜索,直到满足递归出口:row == 8 && col == 8 说明board遍历完毕,得到结果; 如果函数最终返回却没有满足那个条件的话,就说明此局无解。

在解此题时主要遇到的问题是对递归出口判断的模棱两可,还有传board的时候我老是喜欢传个引用,导致一次深搜改变了board。。这是个bug,在word breakII时也遇到过。总值对此题的理解还需深入,继续推敲。

void solver(vector<vector<char>> board, int row, int col, vector<vector<char>> &ret) {
if (board[row][col] != '.') {
if (row == 8 && col == 8) {
ret = board;
return;
}
else if (++col >= 9) {
++row;
col = 0;
}
solver(board, row, col, ret);
return;
}

// calculate solve space
unordered_set<char> set = preset;
// filter colum
for (int k = 0; k < 9; k++) {
char searched = board[k][col];
if (searched != '.' && set.find(searched) != set.end()) {
set.erase(searched);
}
}
// filter row
for (int k = 0; k < 9; k++) {
char searched = board[row][k];
if (searched != '.' && set.find(searched) != set.end()) {
set.erase(searched);
}
}
// filter 3*3
int square_row_offset = row / 3;
int square_col_offset = col / 3;
for (int k = square_row_offset * 3; k < square_row_offset * 3 + 3; k++) {
for (int l = square_col_offset * 3; l < square_col_offset * 3 + 3; l++) {
char searched = board[k][l];
if (searched != '.' && set.find(searched) != set.end()) {
set.erase(searched);
}
}
}

for (char ele: set) {
board[row][col] = ele;

if (row == 8 && col == 8) {
ret = board;
return;
}

solver(board, row, col+1, ret);
}
}

vector<vector<char>> sudokuSolver(vector<vector<char>> &board) {
vector<vector<char>> ret;
solver(board, 0, 0, ret);
return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: