sudoku-solver(数独问题)

题目

编写一个程序,通过填充空单元格来解决数独谜题。
空单元格由字符'.'表示。
你可可以认为只有一个独特的解决方案。

这里写图片描述

分析

该题类似于八皇后问题

代码实现

public class Solution {
    public void solveSudoku(char[][] board) {
        if(board==null || board.length==0 || board[0].length==0) return ;
        solve(board,0);
    }
    public boolean solve(char [][] board , int step){
        if(step == 81){
            return isValidate(board);
        }else{
            //根据step确定行,列
            int x=step/9;
            int y=step%9;
            if(board[x][y]!='.'){
                //// 如果x,y处不是'.'那么直接进一步深度搜索
                return solve(board,step+1);
            }else{
                // 需要填写数字,填写1-9判断是不是有效的数独输入
                for(int i=1;i<10;i++){
                    board[x][y]=(char)(i+'0');
                    if(isValidate(board)){
                        if(solve(board,step+1)){
                            return true;
                        }
                    }
                    board[x][y]='.';
                }
                return false;
            }
        }
    }
    public boolean isValidate(char [][] board){
        //行遍历与列遍历验证
        for(int i = 0;i < 9;i++){
            int [] num1 = new int [9];
            for(int j = 0;j < 9;j++){
                if(board[i][j] != '.'){
                    if(num1[(int)(board[i][j]-'1')] == 1){
                        return false;
                    }else{
                        num1[(int)(board[i][j]-'1')] = 1;
                    }
                }
            }
            int [] num2 = new int [9];
            for(int j = 0;j < 9;j++){
                if(board[j][i] != '.'){
                    if(num2[(int)(board[j][i]-'1')] == 1){
                        return false;
                    }else{
                        num2[(int)(board[j][i]-'1')] = 1;
                    }
                }
            }
        }
        //小九宫格遍历验证
        for(int i = 0; i < 3;i++){
            for(int j = 0;j < 3;j++){
                int [] num = new int [9];
                // 九宫格遍历
                for(int k1 = 0; k1 < 3;k1++){
                    for(int k2 = 0;k2 < 3;k2++){
                        if(board[i*3+k1][j*3+k2] != '.'){
                            if(num[(int)(board[i*3+k1][j*3+k2]-'1')]==1){
                                return false;
                            }else{
                                num[(int)(board[i*3+k1][j*3+k2]-'1')]=1;
                            }
                        }
                    }
                }
            }
        }

        return true;
    }
}

题目来自牛客网leetcode

猜你喜欢

转载自blog.csdn.net/everyfriday_shujk/article/details/80331068