LeetCode 37 解数独
LeetCode37 解数独
题目描述
编写一个程序,通过填充空格来解决数独问题。
样例
算法分析
dfs
预处理出row,col,cell数组,某些元素的位置已经被标识过
- 若该位置已经被表示过,则直接跳去下一个位置
- 没有表示,尝试填数,填完后 row、col、cell都要更新
- 回溯
- 若能经过最后一个,返回true
时间复杂度
Java代码
class Solution {
static boolean dfs(char[][] board, boolean[][] row, boolean[][] col, boolean[][][] cell, int x, int y){
if( y == 9 ){
//跳到下一行
x ++ ;
y = 0;
if(x == 9) return true; //说明经过了最后一个
}
if(board[x][y] != '.') return dfs(board,row,col,cell,x,y+1);
for(int i = 1; i <= 9; i++){
if( !row[x][i] && !col[y][i] && !cell[x/3][y/3][i]){
board[x][y] = (char)('0' + i);
row[x][i] = true;
col[y][i] = true;
cell[x/3][y/3][i] = true;
if(dfs(board,row,col,cell,x,y+1)) return true;
//回溯
board[x][y] = '.';
row[x][i] = false;
col[y][i] = false;
cell[x/3][y/3][i] = false;
}
}
return false;
}
public void solveSudoku(char[][] board) {
boolean[][] row = new boolean[10][10];
boolean[][] col = new boolean[10][10];
boolean[][][] cell = new boolean[3][3][10];
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
if(board[i][j] != '.'){
int t = board[i][j] - '0';
row[i][t] = true;
col[j][t] = true;
cell[i/3][j/3][t] = true;
}
}
}
dfs(board,row,col,cell,0,0);
}
}

浙公网安备 33010602011771号