37. 解数独(回溯)

150 阅读1分钟

class Solution {
    boolean[][] row = new boolean[9][9];
    boolean[][] col = new boolean[9][9];
    boolean[][][] cell = new boolean[3][3][9];

    public void solveSudoku(char[][] board) {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                char c = board[i][j];
                if (c != '.') {
                    int t = c - '1';
                    row[i][t] = col[j][t] = cell[i / 3][j / 3][t] = true;
                }
            }
        }
        dfs(board, 0, 0);
    }

    private boolean dfs(char[][] board, int x, int y) {
        //转向下一行
        if (y == 9) return dfs(board, x + 1, 0);
         
        if(x==9) return true;
        if(board[x][y]!='.') return dfs(board, x, y + 1);
        for (int i = 0; i < 9; i++) {
            if (row[x][i] || col[y][i] || cell[x / 3][y / 3][i]) {
                continue;
            }
            row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = true;
            board[x][y] = (char) (i + '1');
            if(dfs(board, x, y + 1)) return true;
            board[x][y] = '.';
            row[x][i] = col[y][i] = cell[x / 3][y / 3][i] = false;
        }
        return false;
    }
}