填充数独算法

//编写一个程序,通过填充空格来解决数独问题。
//
// 数独的解法需 遵循如下规则:
//
//
// 数字 1-9 在每一行只能出现一次。
// 数字 1-9 在每一列只能出现一次。
// 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
//
//
// 数独部分空格内已填入了数字,空白格用 '.' 表示。
//
//
//
//
//
//
// 示例:
//
//
//输入:board = [["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"]]
//输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"
//],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["
//4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","
//6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","
//5","2","8","6","1","7","9"]]
//解释:输入的数独如上图所示,唯一有效的解决方案如下所示:
//
//
//
//
//
//
// 提示:
//
//
// board.length == 9
// board[i].length == 9
// board[i][j] 是一位数字或者 '.'
// 题目数据 保证 输入数独仅有一个解
//
//
//
//
// Related Topics 数组 回溯 矩阵
// 👍 885 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    //定义x行,数字n-1是否被占用
    boolean[][] row = new boolean[9][9];
    //定义y行,数字n-1是否被占用
    boolean[][] colume = new boolean[9][9];
    //定义x/3,y/3 单元块中数字n-1是否被占用
    boolean[][][] cell = new boolean[3][3][9];
    public void solveSudoku(char[][] board) {
        //初始化已知数据
        for(int x=0;x<9;x++){
            for(int y=0;y<9;y++){
                if(board[x][y]!='.'){
                    int num = (int)board[x][y]-'1';
                    row[x][num]=true;
                    colume[y][num]=true;
                    cell[x/3][y/3][num]=true;
                }
            }
        }
        dsf(board,0,0);
    }
    Boolean dsf(char[][] board,int x,int y){
        //设置结束条件

        //如果最后一行执行完毕,返回成功
        if(x==9){return true;}
        //如果最后一列执行完毕,继续下一行开始位置
        if(y==9){return dsf(board,x+1,0);}
        //如果该位置有值,换下一位置填充
        if(board[x][y]!='.'){
            return dsf(board,x,y+1);
        }

        //尝试填入1-9数字
        for(int i=0;i<9;i++){
            //如果填入数字满足三个条件  及(该行该列该单元没有这个值则可以填入)
            if(!row[x][i]&&!colume[y][i]&&!cell[x/3][y/3][i]){
                board[x][y] =(char)(i+'1');
                row[x][i]=true;
                colume[y][i]=true;
                cell[x/3][y/3][i]=true;
                //如果后续位置填入成功,则该位置填入的值为正确值
                if(dsf(board,x,y+1)){
                    break;
                }else{
                    //不合理的值,将记录中的值去掉;
                    board[x][y] = '.';
                    row[x][i]=false;
                    colume[y][i]=false;
                    cell[x/3][y/3][i]=false;
                }
            }
        }
        //尝试填入1-9后,如果填入成功,则返回成功,否则失败
        return board[x][y] != '.';
    }
}
//leetcode submit region end(Prohibit modification and deletion)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值