您的位置:首页 > 编程语言 > Java开发

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode java