(leetcode)解数独-DFS

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(leetcode)解数独-DFS相关的知识,希望对你有一定的参考价值。

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

数独的解法需 遵循如下规则:

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。

题目连接戳这里!!!

public class DFS {
    public static boolean isFinish = false;
    public static boolean check(char [][]table, int x, int y, int i){
        //检查table[x][y]填入i是否合法
        for(int j=0; j<9; j++){
            if(table[x][j] == ('0' + i)){ //table[x][y]所在行
                return false ;
            }
            if(table[j][y] == ('0' + i)){ //table[x][y]所在列
                return false ;
            }
        }
        for(int j=(x/3)*3; j<(x/3+1)*3; j++){ //table[x][y]所在9宫格
            for(int k=(y/3)*3; k<(y/3+1)*3; k++){
                if(table[j][k] ==('0' + i)){
                    return false ;
                }
            }
        }
        return true ;
    }
    public static void dfs(char [][] table, int x, int y){
        if(x == 9){
            isFinish = true ;
             return ;
        }
        if(table[x][y] == '.'){//当前位置没有元素
            for(int i=1; i<=9; i++){ //将合法的字符填入当时空中
                if(check(table,x,y,i)){
                    table[x][y] = (char)('0' + i) ;
                    dfs(table, x+ (y+1) / 9,(y+1)%9) ;//递归到下一个空
                    if(isFinish){ //完成后,层层返回
                        return ;
                    }
                }
            }
            table[x][y] ='.' ; //回溯到上一次递归的位置
        }else{ //当前位置有元素,递归到下个空
            dfs(table, x+(y+1)/9, (y+1)%9) ;
        }
    }
    public static void solve(char [][] table){
        isFinish = false ;
        dfs(table,0,0) ;
        for(int i=0; i<9; i++){
            for(int j=0; j<9; j++){
                System.out.print(table[i][j] + " ") ;
            }
            System.out.println() ;
        }
    }
    public static void main(String[] args){
        char[][] table = new char[][]{
                {'5', '3', '.', '.', '7', '.', '.', '.', '.'},
                {'6', '.', '.', '1', '9', '5', '.', '.', '.'},
                {'.', '9', '8', '.', '.', '.', '.', '6', '.'},
                {'8', '.', '.', '.', '6', '.', '.', '.', '3'},
                {'4', '.', '.', '8', '.', '3', '.', '.', '1'},
                {'7', '.', '.', '.', '2', '.', '.', '.', '6'},
                {'.', '6', '.', '.', '.', '.', '2', '8', '.'},
                {'.', '.', '.', '4', '1', '9', '.', '.', '5'},
                {'.', '.', '.', '.', '8', '.', '.', '7', '9'}
        } ;
     solve(table) ;
    }
}

以上是关于(leetcode)解数独-DFS的主要内容,如果未能解决你的问题,请参考以下文章

图-搜索-DFS-37. 解数独

HDU 1426 Sudoku Killer(dfs 解数独)

python解数独

LeetCode 37.解数独

LeetCode-37.解数独

leetcode——37.解数独