Loading

LeetCode 37 解数独

LeetCode37 解数独

题目描述

编写一个程序,通过填充空格来解决数独问题。

样例

算法分析

dfs

预处理出row,col,cell数组,某些元素的位置已经被标识过

  • 若该位置已经被表示过,则直接跳去下一个位置
  • 没有表示,尝试填数,填完后 row、col、cell都要更新
  • 回溯
  • 若能经过最后一个,返回true

时间复杂度

Java代码

class Solution {
    static boolean dfs(char[][] board, boolean[][] row, boolean[][] col, boolean[][][] cell, int x, int y){
        if( y == 9 ){
            //跳到下一行
            x ++ ;
            y = 0;

            if(x == 9) return true; //说明经过了最后一个
        }

        if(board[x][y] != '.') return dfs(board,row,col,cell,x,y+1);

        for(int i = 1; i <= 9; i++){
            if( !row[x][i] && !col[y][i] && !cell[x/3][y/3][i]){
                board[x][y] = (char)('0' + i);
                row[x][i] = true;
                col[y][i] = true;
                cell[x/3][y/3][i] = true;

                if(dfs(board,row,col,cell,x,y+1)) return true;

                //回溯
                board[x][y] = '.';
                row[x][i] = false;
                col[y][i] = false;
                cell[x/3][y/3][i] = false;
            }
        }

        return false;
    }



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

        for(int i = 0; i < 9; i++){
            for(int j = 0; j < 9; j++){
                if(board[i][j] != '.'){
                    int t = board[i][j] - '0';
                    row[i][t] = true;
                    col[j][t] = true;
                    cell[i/3][j/3][t] = true;
                }
            }
        }

        dfs(board,row,col,cell,0,0);
    }
}
posted @ 2020-11-02 15:11  想用包子换论文  阅读(87)  评论(0)    收藏  举报