题目:
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
提示:
board.length == 9
board[i].length == 9
board[i][j] 是一位数字或者 ‘.’
题目数据 保证 输入数独仅有一个解
解题代码:
class Solution {
public void solveSudoku(char[][] board) {
boolean[][] line = new boolean[9][9];
boolean[][] column = new boolean[9][9];
boolean[][][] block = new boolean[3][3][9];
// 先将已经使用过的数字加入到三个数组中
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
if(board[i][j] != '.'){
int num = board[i][j] - '0' - 1;
line[i][num] = true;
column[j][num] = true;
block[i/3][j/3][num] = true;
}
}
}
dfs(board, line, column, block, 0, 0);
}
public boolean dfs(char[][] board, boolean[][] line, boolean[][] column, boolean[][][] block, int i, int j){
// 找到空的位置
while(board[i][j] != '.'){
if(++j >= 9){
i++;
j = 0;
}
if(i >= 9)
return true;
}
// 从0开始填充
for(int num = 0; num < 9; num++){
// 判断填充的数是否在当前列、行、块中使用过
if(!line[i][num] && !column[j][num] && !block[i/3][j/3][num]){
// 将num填充到board[i][j]的位置
line[i][num] = true;
column[j][num] = true;
block[i/3][j/3][num] = true;
board[i][j] = (char)(num + '1');
// 进行下一次递归
if(dfs(board, line, column, block, i, j)){
return true;
}else{
line[i][num] = false;
column[j][num] = false;
block[i/3][j/3][num] = false;
board[i][j] = '.';
}
}
}
return false;
}
}