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

程序说明: Matrix Sudoku Solver 解独矩阵是一款计算机模拟人工思路求解数独的程序。它能利用大部分的人工解法完成对简单、中等、困难、专家以及骨灰级的数独求解。家可以将需要求解的数独输入矩阵后,按照提示或结合逻辑求解,也可以按下自动按钮,让程序帮您完成剩下的求解工作,并在得到正确的求解数独后,自动将求解步骤复制到剪贴板,让您可以在其他文本编辑器中粘贴查看,十分的人性化。 功能介绍: 为方便用户使用,本程序分为菜单栏,主界面功能按钮,底部面板提示区。 菜单栏功能介绍: 》选项: 清空:将主界面数独矩阵清空,程序回到初始界面。 读取:读取已存盘的数独文件,并将其显示在主界面数独矩阵中。 保存:保存当前主界面数独,将所有值存档。 启用TTS语音提示:该选项可以开启语音提示功能,开启后程序将自动读出程序底部面板提示区的内容。开启前请确认系统中是否已安装TTS语音引擎。若没有安装,请到微软TTS官网下载语音引擎。 退出:退出程序 》解题: 锁定已知数:将已填入的初局数独锁定,准备求解。 显示候选数提示:开启后鼠标在某个格子悬停会出现该格可以填入的候选数。 提示值自动填入:开启后按下提示按钮会自动将提示值填入格内。 按步提示:锁定后可用,提示当前数独如何求解 自动解题:锁定后可用,自动求解当前数独。 强制求解:锁定后可用,可对无法用自动求解完成的数独进行强制求解,程序必会返回可解或不可解的结果。 重做:锁定后可用,将所有未锁定的值清空。 》主题: 本程序提供多种主题界面选择,让家在自己喜爱的主题中求解数独。除了程序自带的五种主题,用户还可以自定义背景,选择自己喜欢的图片作为程序背景。 》帮助: 数独简介:介绍数独由来,发展,规则介绍 程序说明:程序的介绍,程序功能的说明 解法介绍:介绍程序中使用及尚未加入的一些数独逻辑求解方法。 关于:程序信息,开发组信息 主界面功能按钮介绍: 提示:同菜单《解题》中的《按步提示》 锁定:同菜单《锁定》中的《锁定已知数》 保存:同菜单《选项》中的《保存》 读取:同菜单《选项》中的《读取》 重做:同菜单《解题》中的《重做》 清空:同菜单《选项》中的《清空》 自动:同菜单《解题》中的《自动解题》 提示候选数:同菜单《解题》中的《显示候选数提示》 底部面板提示区介绍: 程序求解数独的全部提示信息将全部显示在此处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值