回溯例题(leetcode17/37)

news/2024/7/20 22:45:24 标签: 深度优先, 算法

文章目录

  • leetcode37
  • leetcode17

回溯跟枚举差不多。要注意“回溯”,别忘记“回”之前把之前的改动都复原。

leetcode37

在这里插入图片描述

leetcode37是解数独问题。本题保证有且仅有唯一解。

思路:先把空格子的位置存下来,然后对每一个空位置挨个枚举1-9。枚举之前,先建立一个一维数组,把要排除的数先排除,效率会高些。

class Solution {
    // 空格的信息
    int x[100], y[100], cnt = 0;
    
    bool dfs(int i, vector<vector<char>>& board) {
        if (i == cnt) return true;

        bool s[60] = {false};

        // 检查行、列
        for (int j = 0; j < 9; j++) 
                s[board[x[i]][j]] = s[board[j][y[i]]] = true;
        
        // 检查九宫格
        for (int j = x[i] / 3 * 3; j < x[i] / 3 * 3 + 3; j++)
            for (int k = y[i] / 3 * 3; k < y[i] / 3 * 3 + 3; k++)
                    s[board[j][k]] = true;

        // 枚举尝试1-9
        for (char c = '1'; c <= '9'; c++) {
            if (s[c] == false) {
                board[x[i]][y[i]] = c;
                if (dfs(i + 1, board))
                    return true;

            }
        }
        board[x[i]][y[i]] = '.';
        return false;
    }

public:
    void solveSudoku(vector<vector<char>>& board) {

        // 检索空格子
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] == '.') {
                    x[cnt] = i;
                    y[cnt++] = j;
                }
            }
        }

        dfs(0, board);
        return;
    }
};

leetcode17

在这里插入图片描述
leetcode17是纯纯的枚举问题。

逐位处理那串数字,把记录好的当作参数string alreadyHave。由于这个形参是每递归一下就新开辟一个栈帧,所以这样写不涉及到“改动复原”的事。如果占用空间太大了,就需要把这个参数改为引用,那么就需要“复原”了。

class Solution {
    vector<string> ans;
    string d;
    void dfs(int index, string alreadyHave) // index是待处理下标
    {
        if (index == d.length()) {
            if (alreadyHave != "")
                ans.push_back(alreadyHave);
            return;
        }
        int num = d[index] - '0', start, end;

        if (num >= 2 && num <= 7) {
            start = (num - 2) * 3 + 'a';
            end = start + 2;
        }
        if (num == 7)
            end++;
        if (num == 8) {
            start = 't';
            end = 'v';
        }
        if (num == 9) {
            start = 'w';
            end = 'z';
        }

        for (int i = start; i <= end; i++) {
            dfs(index + 1, alreadyHave + (char)(i));
        }
        return;
    }

public:
    vector<string> letterCombinations(string digits) {
        d = digits;
        dfs(0, "");
        return ans;
    }
};

http://www.niftyadmin.cn/n/5402281.html

相关文章

mybatis mysql insert 主键id为空

错误示范 java代码设置了param参数&#xff0c;但是sql 字段没有带上参数&#xff0c;例如 void insertV2(Param("historyDO") HistoryDO historyDO); <insert id"insertDuplicate" parameterType"com.test.entity.HistoryDO"keyProperty&…

有趣的数学 矩阵的秩描述了什么信息?

一、什么是矩阵的秩&#xff1f; 矩阵的秩是线性代数领域中一个非常重要的概念&#xff0c;因为它帮助我们知道是否可以找到方程组的解。矩阵的秩还可以帮助我们了解其向量空间的维数。 矩阵的秩是最高阶非零次数的阶数。矩阵的秩等于其中线性独立的行&#xff08;或列&#xf…

【开源】JAVA+Vue.js实现木马文件检测系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 木马分类模块2.3 木马软件模块2.4 安全资讯模块2.5 脆弱点模块2.6 软件检测模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 木马分类表3.2.2 木马软件表3.2.3 资讯表3.2.4 脆弱点表3.2.5 软件检测表…

20240301-1-ZooKeeper面试题(一)

1. ZooKeeper 面试题&#xff1f; ZooKeeper 是一个开放源码的分布式协调服务&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#xff0c;将简单易用的接口和性能高效、功能稳定的系统提供给用户。 分布式应…

Chrome插件 | WEB 网页数据采集和爬虫程序

无边无形的互联网遍地是数据&#xff0c;品类丰富、格式繁多&#xff0c;包罗万象。数据采集&#xff0c;或说抓取&#xff0c;就是把分散各处的内容&#xff0c;通过各种方式汇聚一堂&#xff0c;是个有讲究要思考的体力活。君子爱数&#xff0c;取之有道&#xff0c;得注意遵…

智能汽车加速车规级存储应用DS2431P+TR 汽车级EEPROM 存储器IC

DS2431PT&R是一款1024位1-Wire EEPROM芯片&#xff0c;由四页存储区组成&#xff0c;每页256位。数据先被写入一个8字节暂存器中&#xff0c;经校验后复制到EEPROM存储器。该器件的特点是&#xff0c;四页存储区相互独立&#xff0c;可以单独进行写保护或进入EPROM仿真模式…

【airtest】自动化入门教程(二)airtest操作

目录 一、touch 二、wait 三、swipe 四、exists 五、text 六、keyevent 七、snapshot 八、sleep 九、断言 9.1 assert_exists 9.2 assert_not_exists 9.3 assert_equal 9.4 assert_not_equal 前言&#xff1a;本文主要针对aritest部分的基础操作,aritest是一个跨平…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的口罩识别系统(Python+PySide6界面+训练代码)

摘要&#xff1a;开发口罩识别系统对于提升公共卫生安全和疫情防控具有重要意义。本篇博客详细介绍了如何利用深度学习构建一个口罩识别系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并结合了YOLOv7、YOLOv6、YOLOv5的对比&#xff0c;给出…