LeetCode37 Sudoku Solver
2016-08-25 23:10
387 查看
题目:
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. (Hard)
分析:
DFS搜索,但是不太好写。依次尝试所有可能的数字,然后递归地继续向后添加,发现当填入任何数字都无法满足条件(行列九宫格)后返回false(说明前面填错了)。
想清楚递归地过程的话也不是很难理解。
注意事项:
1.每个数字添加后判断本行,本列和所在九宫格即可,不必判断所有数独内容;
2.自己依照上一题isValid函数写的条件判定代码。导致少了一个board[i][j] != '.'的判断(见代码注释部分),导致所有情况都返回false(因为其会对flag['.' - '0']赋值为1,然后判断等于1)这里错了好久才发现。
代码:
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. (Hard)
分析:
DFS搜索,但是不太好写。依次尝试所有可能的数字,然后递归地继续向后添加,发现当填入任何数字都无法满足条件(行列九宫格)后返回false(说明前面填错了)。
想清楚递归地过程的话也不是很难理解。
注意事项:
1.每个数字添加后判断本行,本列和所在九宫格即可,不必判断所有数独内容;
2.自己依照上一题isValid函数写的条件判定代码。导致少了一个board[i][j] != '.'的判断(见代码注释部分),导致所有情况都返回false(因为其会对flag['.' - '0']赋值为1,然后判断等于1)这里错了好久才发现。
代码:
class Solution { private: bool isValid (vector<vector<char>>& board, int x, int y) { int flag[10] = {0}; for (int i = 0; i < board.size(); ++i) { if (board[x][i] != '.') { //少了这句会导致这个判断总是false!!! if (flag[board[x][i] - '0'] == 1) { return false; } else { flag[board[x][i] - '0'] = 1; } } } memset(flag,0,sizeof(flag)); for (int i = 0; i < board.size(); ++i) { if (board[i][y] != '.') { if (flag[board[i][y] - '0'] == 1) { return false; } else { flag[board[i][y] - '0'] = 1; } } } memset(flag,0,sizeof(flag)); int sqx = (x / 3) * 3; int sqy = (y / 3) * 3; for (int i = sqx; i < sqx + 3; ++i) { for (int j = sqy; j < sqy + 3; ++j) { if (board[i][j] != '.') { if (flag[board[i][j] - '0'] == 1) { return false; } else { flag[board[i][j] - '0'] = 1; } } } } return true; } bool solvehelper(vector<vector<char>>& board) { for (int i = 0; i < board.size(); ++i) { for (int j = 0; j < board.size(); ++j) { if (board[i][j] == '.') { for (int k = 0; k < 9; ++k) { board[i][j] = '1' + k; if (isValid(board, i, j)) { if (solvehelper(board)) { return true; } } } board[i][j] = '.'; return false; } } } return true; } public: void solveSudoku(vector<vector<char>>& board) { bool b = solvehelper(board); } };
相关文章推荐
- LeetCode(37) Sudoku Solver
- leetcode 37 sudoku solver
- python实现 LeetCode37——Sudoku Solver
- LeetCode 37.Sudoku Solver
- leetcode 37. Sudoku Solver
- leetcode-37-sudoku solver
- [LeetCode 37] Sudoku Solver回溯解法
- leetcode 37: Sudoku Solver
- leetcode 37. Sudoku Solver
- [leetcode 37] Sudoku Solver
- leetcode[37]Sudoku Solver
- LeetCode 37 Sudoku Solver(求解数独)(*)
- LeetCode 37 Sudoku Solver (C,C++,Java,Python)
- LeetCode题目:37. Sudoku Solver
- leetcode题解c++ | 37. Sudoku Solver
- LeetCode 37. Sudoku Solver
- LeetCode 37 Sudoku Solver 回溯和深度遍历 还要学习
- leetcode 37:Sudoku Solver
- Leetcode (37) Sudoku Solver
- LeetCode_37 Sudoku Solver