7.14解数独(LC37-H)

news2025/5/24 13:43:06

算法:

二维递归(递归时需要两层for循环)

一个for循环放行

另一个for循环放列

画树:

因为这个树形结构太大了,我抽取一部分,如图所示:

回溯三部曲:

1.确定函数参数和返回值

返回值:

boolean。因为只要解一个数独就可以返回了,不用一直搜取结果。

如果要把整棵树的所有结果都返回,才用void

参数:

char[][] board。题目自带的。

2.确定终止条件

本题递归不用终止条件

递归的下一层的棋盘一定比上一层的棋盘多一个数,等数填满了棋盘自然就终止(填满当然好了,说明找到结果了),所以不需要终止条件!

3.单层递归逻辑

        for (int i = 0; i < 9; i++){ // 遍历行
            for (int j = 0; j < 9; j++){ // 遍历列
                if (board[i][j] != '.'){ // 跳过原始数字
                    continue;
                }
                for (char k = '1'; k <= '9'; k++){ // (i, j) 这个位置放k是否合适
                    if (isValidSudoku(i, j, k, board)){
                        board[i][j] = k;
                        if (solveSudokuHelper(board)){ // 如果找到合适一组立刻返回
                            return true;
                        }
                        board[i][j] = '.';//找不到就放"."
                    }
                }
                // 9个数都试完了,都不行,那么就返回false
                return false;
                // 因为如果一行一列确定下来了,这里尝试了9个数都不行,说明这个棋盘找不到解决数独问题的解!
                // 那么会直接返回, 「这也就是为什么没有终止条件也不会永远填不满棋盘而无限递归下去!」
            }
        }
        // 遍历完没有返回false,说明找到了合适棋盘位置了
        return true;
    }

判断棋盘是否合法

  • 同行是否重复
    for (int i = 0; i < 9; i++) { // 判断行里是否重复
        if (board[row][i] == val) {
            return false;
        }
    }

  • 同列是否重复
    for (int j = 0; j < 9; j++) { // 判断列里是否重复
        if (board[j][col] == val) {
            return false;
        }
    }

  • 9宫格里是否重复
   int startRow = (row / 3) * 3;
    int startCol = (col / 3) * 3;
    for (int i = startRow; i < startRow + 3; i++) { // 判断9方格里是否重复
        for (int j = startCol; j < startCol + 3; j++) {
            if (board[i][j] == val ) {
                return false;
            }
        }
    }
    return true;}

正确代码:

class Solution {
    public void solveSudoku(char[][] board) {
        backtracking(board);

    }
    boolean backtracking (char[][] board){
    //二维递归
    for (int row = 0; row < 9; row++){
        for (int col = 0; col < 9; col++){
           //若该位置有数字了,就跳出本层循环
           if  (board[row][col] != '.') continue;
           //循环放置数字1-9
           for (char k = '1'; k <= '9'; k++){
               if (isValid(row, col, k, board)){
                   board[row][col] = k;
                //如果找到合适一组立刻返回
                if (backtracking(board)) return true;
               }
            board[row][col] = '.';
           }
// 9个数都试完了,都不行,那么就返回false
// 因为如果一行一列确定下来了,这里尝试了9个数都不行,说明这个棋盘找不到解决数独问题的解!
// 那么会直接返回, 「这也就是为什么没有终止条件也不会永远填不满棋盘而无限递归下去!
        
            return false;
        }
         
    }
         return true;
    }
    boolean isValid(int row, int col, char var, char[][]board){
    //先判错
    //同行不重复  
    for (int i = 0; i <9; i++){
        if (board[row][i] == var) return false;
    }


    //同列不重复
    for (int i = 0; i <9; i++){
        if (board[i][col] == var) return false;
    }

    //9宫格不重复 
    int startrow = (row/3)*3; 
    //  `/` 表示整数除法。比如,row=0,startrow=0; row=3,startrow=3
    int startcol = (col/3)*3;
    for (int i= startrow; i < startrow+3; i++){
        for (int j= startcol; j < startcol+3; j++){
            if (board[i][j] == var)  return false;
        }
    }

        return true;

    }


}

这道题好难,不太会写代码,边看正确答案边写的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1355968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个完整的测试流程包括哪些?测试人员需要做什么?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

案例074:基于微信小程序的儿童预防接种预约管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

被低估的流量宝地,如何通过Reddit为Shopify店铺引流?

独立站店铺相对于电商平台来说&#xff0c;有一个运营难点那就是需要自主引流。做好引流&#xff0c;你的Shopify店铺也就成功了一半。Reddit作为国外知名的论坛平台&#xff0c;非常适合作为引流的阵地&#xff0c;许多人对这个网站尚不了解&#xff0c;接下来就为大家介绍如何…

C++ namespace 学习

源自&#xff1a;【C】-命名空间的概念及使用_命名空间的概念及作用-CSDN博客 摘抄&#xff1a;

Android Studio新手实战——深入学习Activity组件

目录 前言 一、Activity简介 二、任务栈相关概念 三、常用Flag 四、结束当前Activity 五、Intent跳转Activity 六、更多资源 前言 Android是目前全球最流行的移动操作系统之一&#xff0c;而Activity作为Android应用程序的四大组件之一&#xff0c;是Android应用程序的核…

HackTheBox - Medium - Linux - Socket

Socket Socket 是一台中等难度的 Linux 机器&#xff0c;其特点是反转 Linux/Windows 桌面应用程序以获取其源代码&#xff0c;从那里发现其 Web 套接字服务中的“SQL”注入。转储数据库会显示一个哈希值&#xff0c;一旦破解&#xff0c;就会产生对该框的“SSH”访问。最后&a…

pytest conftest通过fixture实现变量共享

conftest.py scope"module" 只对当前执行的python文件 作用 pytest.fixture(scope"module") def global_variable():my_dict {}yield my_dict test_case7.py import pytestlist1 []def test_case001(global_variable):data1 123global_variable.u…

Selenium自动化测试框架的搭建

说 起自动化测试&#xff0c;我想大家都会有个疑问&#xff0c;要不要做自动化测试&#xff1f; 自动化测试给我们带来的收益是否会超出在建设时所投入的成本&#xff0c;这个嘛别说是我&#xff0c;即便是高手也很难回答&#xff0c;自动化测试的初衷是美好的&#xff0c;而测…

设计模式:简单工厂模式

这里写目录标题 工厂模式简介核心角色&#xff1a;实现 工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种将对象的实例化过程封…

05-微服务-RabbitMQ-概述

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&am…

【数据库原理】(6)关系数据库的关系操作集合

基本关系操作 关系数据操作的对象都是关系,其操作结果仍为关系,即集合式操作。关系数据库的操作可以分为两大类&#xff1a;数据查询和数据更新。这些操作都是基于数学理论&#xff0c;特别是集合理论。下面是对这些基本操作的解释和如何用不同的关系数据语言来表达这些操作的…

linux usb 驱动介绍

通用串行总线(USB)是一个在主机和许多外设之间的连接. 最初它被创建来替代许多慢速和不同的总线- 并口, 串口, 和键盘连接--有一个单个的所有设备都可以连接的总线类型. [45] USB 已经成长超出了这些 慢速连接并且现在支持几乎每种可以连接到 PC 的设备. USB 规范的最新版本增加…

ida pro linux

结论&#xff0c; 放弃 linux下ida&#xff1b;改用 linux 下 kvm 运行winxp &#xff0c;在winxp中运行ida7 “IDA Pro Advanced v5.7.0.935 (Linux) (Kaspersky Labs) © Hex-Rays.zip” 在ubuntu22x64下运行例子 ls -lh "IDA Pro Advanced v5.7.0.935 (Linux) (…

超简单|配图详细| 双系统Ubuntu22.04 系统磁盘扩容

因为磁盘不够了&#xff0c;磁盘后面没有容量了&#xff0c;resize只能向后扩容&#xff0c;我磁盘中中只有前边有空闲&#xff0c;所以挂载新的分区。 1. 打开磁盘工具 在应用程序中找到 磁盘 软件&#xff0c;打开它。 找到一个空闲分区&#xff0c;获取所有权 选中启用递归…

param_validator 核心代码实现

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节预告 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器&#xff0c;从编码到发布全过程》 2、相关回顾 pyparamval…

02. BI - Project Two, 男女声音识别

文章目录 Hi, 你好。我是茶桁。 上一节课&#xff0c;咱们用一个员工离职预测的案例来学习了LR和SVM。 那今天咱们还是来看案例&#xff0c;从案例来入手。那今天的例子会带着大家一起来做一个练习&#xff0c;是一个男男女声音识别的例子。数据集来自于3,168个录音的样本&…

力扣:62. 不同路径(动态规划,附python二维数组的定义)

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

VScode安装ESP开发环境

VScode安装ESP开发环境 ESP-IDF 是乐鑫官方的物联网开发框架&#xff0c;适用于 ESP32、ESP32-S、ESP32-C 和 ESP32-H 系列 SoC。它基于 C/C 语言提供了一个自给自足的 SDK&#xff0c;方便用户在这些平台上开发通用应用程序&#xff0c;并集成了大量的软件组件&#xff0c;包…

牵绳遛狗你我他文明家园每一天,助力共建文明社区,基于YOLOv5开发构建公共场景下未牵绳遛狗检测识别系统

遛狗是每天要打卡的事情&#xff0c;狗狗生性活泼爱动&#xff0c;一天不遛就浑身难受&#xff0c;遛狗最重要的就是要拴绳了&#xff0c;牵紧文明绳是养犬人的必修课。外出遛狗时&#xff0c;主人手上的牵引绳更多是狗狗生命健康的一道重要屏障。每天的社区生活中&#xff0c;…

Zabbix 监控介绍

1、功能概述 通常所说的监控&#xff0c;会模糊地包含以上下个细分领域的内容&#xff1a; 应用性能监控&#xff08;Application Performance Monitoring&#xff09;业务交易监控&#xff08;Business Transaction Monitoring&#xff09;网络性能监控&#xff08;Network …