leetcode-37. Sudoku Solver
2016-11-26 16:26
323 查看
leetcode-37. Sudoku Solver
题目: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.
刚拿到这题的时候说实话觉得挺简单的,应该标为中等题才对,后来做的时候确没写出来。。这里有一个小的思路问题,如果回溯法理解的不是很清楚的话会出问题。
其实后来再看比较简单,这里实际上应该写为三部分,也就是不能直接在solveSudoku里面直接写循环。关键在于回溯法和DFS有一些差异,如果是DFS的话肯定是可以直接写循环的。但是回溯法需要将整个图都填满才能知道结果所以这里必须再写一个带有boolean返回值的solver函数才行。并且在当前’.’合法的情况下,还需要讨论下一个’.’的solver能否返回正确的在进行下部判断才行。。我主要就是因为回溯法理解的不够透彻,所以总是觉得可以在solveSudoku里直接写迭代所以总是写不出来。。看过答案才回过神来。。
答案来源
public class Solution { public void solveSudoku(char[][] board) { solver(board); } private boolean solver(char[][] board){ for(int i = 0 ; i < 9 ; i++) for(int j = 0 ; j < 9 ; j++){ if(board[i][j]=='.'){ for(char k = '1' ; k <= '9' ; k++){ if(isvalid(board,i,j,k)){ board[i][j] = k; if(solver(board)) return true; else board[i][j]='.'; } } return false; } } return true; } private boolean isvalid(char[][] board,int i,int j,char c){ for(int k = 0 ; k < 9 ; k++){ if(board[i][k]==c) return false; if(board[k][j]==c) return false; if(board[3*(i/3)+k/3][3*(j/3)+k%3]==c) return false; } return true; } }
相关文章推荐
- [TODO]LeetCode 37. Sudoku Solver
- 个人记录-LeetCode 37. Sudoku Solver
- [LeetCode]37. Sudoku Solver
- leetcode_37. Sudoku Solver ? 待解决
- (Java)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 36. Valid Sudoku 数独问题
- 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 数独求解