sudoku-solver(数独问题)

本文介绍了一种使用回溯法解决数独问题的程序实现方案。通过对每一个空位尝试填入1到9的数字,并验证是否符合数独规则,递归地寻找唯一解。文章详细展示了如何检查行、列及小九宫格的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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

这里写图片描述

分析

该题类似于八皇后问题

代码实现

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值