[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时也遇到过。总值对此题的理解还需深入,继续推敲。
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; }
相关文章推荐
- 算法分析与设计课程(8):【leetcode】Sudoku Solver
- Leetcode Sudoku Solver
- leetcode:sudoku solver
- LeetCode-Sudoku Solver
- LeetCode 37 Sudoku Solver
- LeetCode - Sudoku Solver
- leetcode Sudoku Solver
- Leetcode: Sudoku Solver
- LeetCode 37 Sudoku Solver(求解数独)
- [leetcode 37] Sudoku Solver
- leetcode 37 Sudoku Solver
- [LeetCode]Sudoku Solver
- leetcode 37. Sudoku Solver
- [LeetCode]Sudoku Solver
- leetcode 37. Sudoku Solver
- [Leetcode] 37. Sudoku Solver
- LeetCode Sudoku Solver
- LeetCode解题笔记37 Sudoku Solver
- LeetCode - Sudoku Solver
- leetcode-Sudoku Solver