给定一个数独,判断这个数独是否有效?
解题思路:
- 毫无疑问,这题用的是递归
- 判断当前元素是否为 “.”,如果是分别带入 1~9
- 判断代入的数是否合法
代码如下:
public void solveSudoku(char[][] board){
solveSudoDFS(board,0,0);
}
// i 表示行数,j 表示列数
boolean solveSudoDFS(char [][] board, int i, int j){
if(i == 9) return true;
// 若 j 大于 9,换行处理
if(j >= 9) return solveSudoDFS(board, i + 1, 0);
if(board[i][j] == '.'){
for(int k = 1; k <= 9; k++){
board[i][j] = (char)(k + '0');
// 如果合法,继续处理同行的元素
if(isVaild(board, i,j)){
if(solveSudoDFS(board,i,j + 1))
return true;
}
// 还原
board[i][j] = '.';
}
}
else
return solveSudoDFS(board,i, j + 1);
return false;
}
// 判断当前的元素是否合法
boolean isVaild(char [][] board, int i, int j){
// 判断同列的元素有没有相同的
for(int col = 0; col < 9; col++){
if(col != j && board[i][j] == board[i][col])
return false;
}
// 判断同行的元素是否有相同的
for(int row = 0; row < 9; row++){
if(row != i && board[i][j] == board[row][j])
return false;
}
// 判断同一个九宫格的元素是否有相同的
for(int row = i / 3 * 3; row < i / 3 * 3 + 3; row++){
for(int col = j / 3 * 3; col < j / 3 * 3 + 3; col++ ){
if((row != i || col != j) && board[i][j] == board[row][col])
return false;
}
}
return true;
}