leecode---37---多维数组,dfs---解决一个数独问题
遍历每行
遍历每列
找到一个位置,如果是个空的,就遍历1到九。
写一个函数,判断当前位置如果放了个数字后是否是合理的,所以这个函数是放在if判断里面的,就是如果这个数放这里可以,那么接下去处理。判断方式就是遍历行后遍历列,同时遍历小方框九个参数,如果有相同的返回false。
如果这个位置放了某个数字可以,那么接下去dfs。
题意
给一个二维数组,没填写的地方是‘。’,然后解决这个数独问题。
分析
dfs函数
代码
class Solution {
public void solveSudoku(char[][] board) {
if (board == null || board.length != 9 || board[0].length != 9) return ;
dfs(board);
}
//1.带有回溯的,因为不是求组合数量,而是求正确与否。
//2.选择条件是把九个数字放进去试试,不行回滚回来。
public boolean dfs(char[][] board) {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
//两层循环处理每个节点,如果这个节点是个要填数的地方就使用数字去填写他。
if (board[i][j] == '.') {
//试试九个数字,每个数字都试一次
for (char num='1';num <= '9';num++) {
if (isValid(board,i,j,num)) {//如果当前这个点放进去有效果
board[i][j] = num;
if(dfs(board))return true;
else board[i][j] = '.';//否则就回退将那个位置设置成'.'
}
}
//最后如果九个数字都试过去了还是错误的那么返回false,说明本身这个数组有重复的错误。
return false;
}
}
}
//找了每一个点都看过了说明已经填好了
return true;
}
//判断在i,j坐标点处放上一个c是否能够成立。成立的话就继续
public boolean isValid(char[][] board,int i,int j,char c) {
//行判断
for (int col=0;col < 9;col++) {
if (board[i][col] == c) return false;
}
for (int row = 0; row < 9;row++) {
if (board[row][j] == c) 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 (board[row][col]==c)return false;
}
}
return true;
}
}