Leetcode37题,解数独
Leetcode37:解数独
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
主要思想的话就是先创建三个数组来存储每一列每一行每一个块这个字符出现的情况,遍历数独,将每个位置存在的数存入数组,将’.’所在的行列存入一个数组集合。之后调用递归,来对每一个’.’位置的字符进行尝试,如果尝试失败,则进行回溯。题解如下:
class Solution {
private boolean[][] row = new boolean[9][9];
private boolean[][] col = new boolean[9][9];
private boolean[][][] block = new boolean[3][3][9];
private boolean valid = false;
private List<int[]> list = new ArrayList<>();
public void solveSudoku(char[][] board) {
for(int i = 0; i < 9;i++){
for(int j = 0;j < 9; j++){
if(board[i][j] == '.') list.add(new int[]{i,j});
else{
int digit = board[i][j] - '0' - 1;
row[i][digit] = col[j][digit] = block[i/3][j/3][digit] = true;
}
}
}
dfs(board,0);
}
public void dfs(char[][] board,int num){
if(num == list.size()){
valid = true;
return;
}
int[] temp = list.get(num);
int i = temp[0] , j = temp[1];
for(int n = 0;n < 9 && !valid ;n++){
if(!row[i][n] && !col[j][n] && !block[i/3][j/3][n]){
row[i][n] = col[j][n] = block[i/3][j/3][n] = true;
board[i][j] = (char)(n + '0' + 1);
dfs(board,num+1);
row[i][n] = col[j][n] = block[i/3][j/3][n] = false;
}
}
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 fzzf!
评论
ValineDisqus