2020年9月15日 解数独solveSudoku
class Solution {
public void solveSudoku(char[][] board) {
}
}
解题思路:
数独是我曾经非常喜欢玩的一款游戏,以前在步步高学习机上没有什么可以玩的游戏,所以对数独也算是有一些研究吧。
首先数独是只能有唯一解的,这道题就做得很好,他说明了数独只有唯一的解,因为之前做数独能够存在多解,那时候我解数独的方式比较类似于算法中的递归+回溯,当一个位置能填的数字存在多种可能时,我会先选择一个进行填充,当做到后面发现无解时,就把之前选择的给删掉换一个数字重新做。
数独的正确解法在我的理解里是这样的规则,在整个数独图中找到只能填写一种数字的位置,这是必然存在的这是数独能够得到唯一解的必要条件。数独就是在图中找出能够确定的数字后,寻找下一个唯一确定的数字的过程。
那么这道题的思路我们可以这么设计。
首先,这一种方法大概率不会通过,因为是最暴力的算法,我们直接使用递归,说是递归实际上就是遍历。找所有点,如果确定只能填写一个数字就把数字填上,然后再次遍历这个二维数组,直到二维数组中每一个位置都有值存在。
代码实现:
char[][] board;
char[] vals={
'1','2','3','4','5','6','7','8','9'};
public void solveSudoku(char[][] board) {
if (this.board==null)
this.board= board;
for(int i=0;i<9;i++){
for (int j=0;j<9;j++){
if (board[i][j]=='.'){
List<Character> val = getVal(i, j);
if (val.size()==1){
board[i][j]=val.get(0);
solveSudoku(board);
return;
}
}
}
}
return;
}
//返回某坐标能够填充的数字
public List<Character> getVal(int x,int y){
List<Character> list=new ArrayList