题目:
我的答案:
看到这个题想到了慢慢试,需要回溯,但写起来还是难,就看了下别人的思路,然后自己敲了一下:
class Solution {
public void solveSudoku(char[][] board) {
boolean[][] row = new boolean[9][9];
boolean[][] col = new boolean[9][9];
boolean[][] grid = new boolean[9][9];
//初始化
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(board[i][j]!='.'){
int digit = board[i][j]-'0';
row[i][digit-1] = true;
col[j][digit-1] = true;
grid[(i/3)*3+(j/3)][digit-1] = true;
}
}
}
reSolveSudoku(board,row,col,grid,0,0);
}
public boolean reSolveSudoku(char[][] board,boolean[][] row,boolean[][] col,boolean[][] grid,int rowNum,int colNum){
if(colNum==9){
rowNum++;
colNum = 0;
if(rowNum==9){
return true;
}
}
if(board[rowNum][colNum]=='.'){
for(int digit=1;digit<=9;digit++){
if(!(row[rowNum][digit-1]||col[colNum][digit-1]||grid[(rowNum/3)*3+(colNum/3)][digit-1])){
board[rowNum][colNum]=(char)(digit+'0');
row[rowNum][digit-1] = true;
col[colNum][digit-1] = true;
grid[(rowNum/3)*3+(colNum/3)][digit-1] = true;
if(reSolveSudoku(board,row,col,grid,rowNum,colNum+1)){
return true;
}else{
board[rowNum][colNum]='.';
row[rowNum][digit-1] = false;
col[colNum][digit-1] = false;
grid[(rowNum/3)*3+(colNum/3)][digit-1] = false;
}
}
}
}else{
return reSolveSudoku(board,row,col,grid,rowNum,colNum+1);
}
return false;
}
}
题解:
官方题解(试图看懂,但难看):
https://leetcode-cn.com/problems/sudoku-solver/solution/jie-shu-du-by-leetcode/
参考题解(看了这个去自己写):
https://leetcode-cn.com/problems/sudoku-solver/solution/hui-su-fa-jie-shu-du-by-i_use_python/
总结:
回溯!!!