0
点赞
收藏
分享

微信扫一扫

leetcode_37.解数独

37. 解数独

backTrack 方法:

  1. 这是一个递归方法,用于回溯填充数独。它使用两层嵌套循环来遍历数独的每个格子。
  2. 如果当前格子为空(即 board[i][j] == '.'),则尝试填充数字 '1' 到 '9'。
  3. 对于每个尝试填充的数字,首先调用 Judge 方法来判断当前数字是否符合数独的规则。
  4. 如果当前数字符合数独的规则,则将其填充到当前格子,并递归调用 backTrack 方法填充下一个格子
  5. 如果递归调用返回 true,表示数独已经填充完成,则直接返回 true,结束递归。
  6. 如果递归调用返回 false,表示当前填充的数字导致后续无法填充完成,则回溯到上一步,尝试下一个数字。
  7. 如果所有数字都尝试过了仍然无法填充完成,则返回 false

Judge 方法:

  1. 这是一个辅助方法,用于判断当前填充的数字是否符合数独的规则。
  2. 它通过检查当前行、当前列和当前小九宫格来确定当前数字是否与已有的数字冲突。
  3. 如果存在冲突,则返回 false,否则返回 true
class Solution {
  public void solveSudoku(char[][] board) {
        backTrack(board);
    }

    public boolean backTrack(char[][] board) {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.') continue;
                for (char k = '1'; k <= '9'; k++) {
                    if(!Judge(board, i, j, k))continue;
                    board[i][j] = k;
                    if (backTrack(board)) return true;
                    board[i][j] = '.';
                }
                return false;
            }
        }
        return true;
    }
    public boolean Judge(char[][] board, int x, int y, char k) {
        for (int i = 0; i < 9; i++) if (board[x][i] == k) return false;
        for (int i = 0; i < 9; i++) if (board[i][y] == k) return false;
        int nx = (x / 3) * 3;
        int ny = (y / 3) * 3;
        for (int i = nx; i < nx + 3; i++) {
            for (int j = ny; j < ny + 3; j++) {
                if (board[i][j] == k) return false;
            }
        }
        return true;
    }

}
举报

相关推荐

0 条评论