LeetCode-0609

37. 解数独(困难)

总结:

  1. 没有返回值,直接在结果数组里面回溯,这时候需要一个返回值判断一下,是否需要回溯之前的搜索。如果搜索结果是true就不需要回溯结果;
  2. dfs不需要套进for里面写,每次dfs需要找到下一个要插入数字的位置即可
class Solution {

    boolean[][] row;
    boolean[][] col;
    boolean[][][] squ;

    public void solveSudoku(char[][] board) {
        
        row = new boolean[9][10];
        col = new boolean[9][10];
        squ = new boolean[3][3][10];

        int cnt = 0;
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                int val = board[i][j]-'0';
                if(board[i][j]=='.'){
                    cnt++;

                }else{
                    row[i][val] = true;
                    col[j][val] = true;
                    squ[i/3][j/3][val] = true;
                }
            }
        }

        dfs(board,cnt,0,0);
        
    }

    public boolean dfs(char[][] board,int n,int i,int j){
        if(n==0 || i>=9){
            return true;
        }

        for(;i<9;i++){
            for(;j<9;j++){
                if(board[i][j]=='.')break;
            }
            if(j==9)j=0;
            else break;
        }


        for(int val = 1;val<10;val++){
            if(row[i][val] || col[j][val] || squ[i/3][j/3][val])continue;

            row[i][val] = true;
            col[j][val] = true;
            squ[i/3][j/3][val] = true;
            board[i][j] = (char)(val+'0');

            if(dfs(board,n-1,i,j+1)){
                return true;
            }else {
                row[i][val] = false;
                col[j][val] = false;
                squ[i/3][j/3][val] = false;
                board[i][j] = '.';
            }
        }    
                
        return false;      
    }
}

你可能感兴趣的:(LeetCode,leetcode,算法)