๐Ÿคฏ37 solve sudoku

https://leetcode.com/problems/sudoku-solver/

ๅš่ฟ™้“้ข˜ๅฑžๅฎžๆœ‰็‚น่‡ชๆฎ‹๏ผŒ็ญ”ๆกˆๆ‘˜่‡ช่ฏ„่ฎบๅŒบ๏ผŒๆˆ‘็š„ๆ€่ทฏๆ—ถๅฏน็š„๏ผŒไฝ†ๆ˜ฏ่ฟ™ไธชin placeไฟฎๆ”นๅพˆ้šพๅ†™ๅฏน็š„ๆ„Ÿ่ง‰๏ผŒๅ› ไธบbacktrackไธ่ƒฝๅ›บๅฎš็ป“ๆžœ

ๅคงๆฆ‚่ฆๆณจๆ„็š„ๅฐฑๆ˜ฏ

  1. ๅœจๆณจๆ„้ๅކ็š„cellไธ้‡ๅค็š„ๅ‰ๆไธ‹ไธ้œ€่ฆvisited๏ผŒๆฏ”ๅฆ‚่ฟ™้‡Œๅฐฑๆ˜ฏๅ…ˆ้ๅކ่กŒ๏ผŒๅˆฐๆœ€ๅณ่พนๅ†ๅŽปไธ‹ไธ€่กŒ๏ผŒ่ฟ™ๆ ท่ฟ”ๅ›žๆกไปถไนŸๅพˆ็ฎ€ๅ•ไบ†๏ผŒ่ตฐๅˆฐๆœ€ๆœ€ๅบ•ไธ‹ไบ†ๅฐฑ่กจ็คบๆ‰พๅˆฐ่งฃไบ†

  2. boardๅฆ‚ๆžœไธsafe่ฟ˜ๆ˜ฏ่ฆ้‡็ฝฎๆˆ '.'๏ผŒไธป่ฆๆ˜ฏ่ฟ™้‡ŒisSafe็š„ๅ†™ๆณ•ๅ†ณๅฎšไบ†ไธŠไธ€ๆฌกๅฐ่ฏ•็š„็ป“ๆžœไผšๅฝฑๅ“ไธ‹ๆฌก็š„ๅˆค่ฏป

  3. ไธ้œ€่ฆๅ•็‹ฌ็š„rows๏ผŒcolsๅ’Œblocksๆฅ่ฎฐๅฝ•ๆ•ฐๅ€ผ๏ผŒ็”จboard่ถณ็Ÿฃ๏ผŒไธ็„ถ็š„ๅ‚ๆ•ฐ้•ฟๅบฆไปฅๅ…‰ๅนด่ฎก็ฎ—

class Solution {
    public boolean helper(char[][] board, int row, int col){
        if(row == board.length){
            return true;
        }
        int nrow = 0;
        int ncol = 0;
        if(col != board.length -1) {
            nrow = row;
            ncol = col+1;
        }else{
            nrow = row+1;
            ncol = 0;
        }

        if(board[row][col] != '.'){
            if(helper(board, nrow, ncol)){
                return true;
            }
        }else{
            for(int i=1; i<=9; i++){
                if(isSafe(board, row, col, i)){
                    board[row][col] = (char)(i + '0');
                    if(helper(board, nrow, ncol)){
                        return true;
                    }else{
                        board[row][col] = '.';
                    }
                }
            }
        }
        return false;

    }
    public boolean isSafe(char[][] board, int row, int col, int number){
        for(int i=0; i<board.length; i++){
            if(board[i][col] == (char)(number + '0')){
                return false;
            }
            if(board[row][i] == (char)(number +'0')){
                return false;
            }
        }
        //grid
        int sr = (row/3) *3;
        int sc = (col/3) *3;
        for(int i = sr; i<sr+3; i++){
            for(int j=sc; j< sc+3; j++){
                if(board[i][j] == (char)(number + '0')){
                    return false;
                }
            }
        }
        return true;
    }
    public void solveSudoku(char[][] board) {
        helper(board, 0, 0);
        
    }
}

ไธ‹้ขๆ˜ฏๆˆ‘่‡ชๅทฑๅ†™็š„็‰ˆๆœฌ: ๅฅฝๅงๅ…ถๅฎžไนŸไธๆ˜ฏๅพˆ้šพ๏ผŒๅ…ณ้”ฎ็‚นๆ˜ฏ้ๅކ็š„้กบๅบ

class Solution {
    public void solveSudoku(char[][] board) {
        dfs(board, 0, 0);
    }
    private boolean dfs(char[][] board, int i, int j) {
        if (i == 9) return true;
        int x, y;
        if (j != 8) {
            x = i;
            y = j + 1;
        } else {
            x = i + 1;
            y = 0;
        }
        
        if (board[i][j] != '.') {
            if (dfs(board, x, y)) return true;
            return false;
        }
        for (char num = '1'; num <= '9'; num++) {
            if (isValid(board, i, j, num)) {
                board[i][j] = num;
                if (dfs(board, x, y)) {
                    return true;
                } else {
                    board[i][j] = '.';
                }
            }
        }
        return false;
    }
    private boolean isValid(char[][] board, int i, int j, char num) {
        for (int col = 0; col < 9; col++) {
            if (board[i][col] == num) return false;
        }
        for (int row = 0; row < 9; row++) {
            if (board[row][j] == num) return false;
        }
        int rs = i / 3 * 3;
        int cs = j / 3 * 3;
        for (int row = rs; row < rs + 3; row++) {
            for (int col = cs; col < cs + 3; col++) {
                if (board[row][col] == num) return false;
            }
        }
        return true;
    }
}

Last updated