当前位置: 首页 > news >正文

回溯算法:解数独

一、问题

二、分析

这题与普通的回溯算法相比,要注意这几点:

1)只要遇到一个满足的,就结束搜寻。(所以我们的函数返回值用布尔,遇到了就向上传递)

2)如何判断棋盘的正确性。(判断函数,其实本质就是一个剪枝,如果不正确就把这个点剪掉)

三、代码

  public void solveSudoku(char[][] board) {
        backtracking(board);
    }
    public boolean backtracking(char[][] board){
        for (char i = 0; i < 9; i++) {
            for (char j =0; j < 9; j++) {//前面的两个for循环,相当于就是9*9层的回溯递归树,因为棋盘的81个区域,每个区域都相当于递归树的一层,每层可以取1-9
                if(board[i][j]=='.'){//遍历所有的空格
                    for (char k = '1'; k <='9' ; k++) {
                        if(PanDuan(i,j,k,board)){//空格里填入符合规格的数字
                            board[i][j]=k;
                           boolean temp= backtracking(board);//用temp来接
                           if(temp==true){
                               return true;
                           }
                            board[i][j]='.';
                        }
                    }
                    return false;//如果某个节点的下一层的9个取值都不行,则这一层返回false,让上一个节点废掉
                }
            }
        }
        return true;//如果把81层树都走完了,那么说明是有正确的完整的棋盘的,把叶子层的true向上返回
    }
    public boolean PanDuan(int row,int col,int i,char[][] board){
        for (int j = 0; j < board.length; j++) {//遍历第row行每一列,查找有无重复数
            if(board[row][j]==i){
                return false;
            }
        }
        for (int j = 0; j < board.length; j++) {//遍历第col列的每一行,查找有无重复数
            if(board[j][col]==i){
                return false;
            }
        }
        int row_c=row%3;
        int col_c=col%3;
        for (int j = row-row_c;j <= row-row_c+2; j++) {//验证九宫格是否合格
            for (int k = col-col_c;k<=col-col_c+2; k++) {
                if(board[j][k]==i){
                    return false;
                }
            }
        }
        return true;
    }

相关文章:

  • 单词接龙--蒟蒻解析
  • 【够用就好005】-在VSCode中管理ECS服务器的实操步骤
  • 基于ros2与gazebo的导航仿真案例
  • 在 Flutter 中实现文件读写
  • 51单片机-8X8LED点阵
  • 01背包,完全背包,多重背包
  • vue,vue3 keepalive没有效果,无法缓存页面include无效,keep-alive
  • 【Git】五、多人协作
  • 鸿蒙-自定义相机拍照
  • 了解string
  • Apache Spark 的主要特点
  • 工厂车辆排队系统
  • 关于解决springcloud 创建bean失败的问题
  • 【python】解析自动化脚本文件并按照=测试周期=存储记录
  • react hook useReducer
  • 如何解决服务器被黑客爬虫攻击:全面防护与优化策略
  • Android TabLayout 实现随意控制item之间的间距
  • rk3588/3576板端编译程序无法运行视频推理
  • vue-element-admin 打包部署到SpringBoot
  • Linux Python 调试/堵塞/性能分析与定位工具
  • 中国新闻发言人论坛在京举行,郭嘉昆:让中国声音抢占第一落点
  • 终于,俄罗斯和乌克兰谈上了
  • 张巍任中共河南省委副书记
  • 中日东三省问题的源起——《1905年东三省事宜谈判笔记》解题
  • 六连板成飞集成:航空零部件业务收入占比为1.74%,市场环境没有重大调整
  • 时隔3年俄乌直接谈判今日有望重启:谁参加,谈什么