【leetcode】深搜、暴搜、回溯、剪枝(C++)3

深搜、暴搜、回溯、剪枝(C++)3

  • 一、解数独
    • 1、题目描述
    • 2、代码
    • 3、解析
  • 二、单词搜索
    • 1、题目描述
    • 2、代码
    • 3、解析
  • 三、黄金矿工
    • 1、题目描述
    • 2、代码
    • 3、解析
  • 四、不同路径III
    • 1、题目描述
    • 2、代码
    • 3、解析


一、解数独

1、题目描述

leetcode链接
在这里插入图片描述

2、代码

class Solution 
{
public:
    // 全局变量
    bool row[9][10]; // 行
    bool col[9][10]; // 列
    bool grid[3][3][10]; // 小格子
    void solveSudoku(vector<vector<char>>& board) 
    {
        // 初始化
        for(int i = 0; i < 9; i++)
        {
            for(int j = 0; j < 9; j++)
            {
                if(board[i][j] != '.') // 是数就填进去
                {
                    int num = board[i][j] - '0'; // 记录一下数
                    row[i][num] = col[j][num] = grid[i / 3][j / 3][num] = true; // 记录被用过了
                }
            }
        }
        dfs(board);
    }
    bool dfs(vector<vector<char>>& board)
    {
        for(int i = 0; i < 9; i++)
        {
            for(int j = 0; j < 9; j++)
            {
                // 填数
                if(board[i][j] == '.')
                {
                    for(int num = 1; num <= 9; num++) // 从1-9一个个遍历填数
                    {
                        if(!row[i][num] && !col[j][num] && !grid[i / 3][j / 3][num])
                        {
                            board[i][j] = num + '0'; // 填入进去
                            row[i][num] = col[j][num] = grid[i / 3][j / 3][num] = true; // 标记用过了
                            if(dfs(board) == true) return true; // 表示可以填进去
                            // 恢复现场
                            board[i][j] = '.';
                            row[i][num] = col[j][num] = grid[i / 3][j / 3][num] = false; // 标记没用
                        }
                    }
                    return false; // 1-9都不行
                }
            }
        }
        return true; // 走完了,填完了,返回true
    }
};

3、解析

在这里插入图片描述

二、单词搜索

1、题目描述

leetcode链接

在这里插入图片描述

2、代码

class Solution 
{
public:
    // 全局变量
    bool visit[7][7];
    int m, n;
    bool exist(vector<vector<char>>& board, string word) 
    {
        m = board.size(); // 总共有多少行
        n = board[0].size(); // 一行有多少个
        for(int i = 0; i < m; i++)
        {
            for(int j = 0; j < n; j++)
            {
                // 匹配
                if(word[0] == board[i][j])
                {
                    visit[i][j] = true; // 标记该点已经被访问过了
                    if(dfs(board, i, j, word, 1/*从第一个位置往下走*/)) return true; // 递归到下一层
                    visit[i][j] = false; // 第一个点位置错误,找下一个第一个对应的点
                }
            }
        }
        return false; // 没有访问到
    }
    // 定义一个上下左右移动的向量
    int dx[4] = {0, 0, -1, 1}; // x x x-1 x+1
    int dy[4] = {1, -1, 0, 0}; // y+1 y-1 y y
    bool dfs(vector<vector<char>>& board, int i, int j, string word, int pos)
    {
        // 递归出口
        if(pos == word.size())
        {
            return true;
        }
        for(int k = 0; k < 4; k++)
        {
            int x = dx[k] + i; // x坐标
            int y = dy[k] + j; // y坐标
            // 不越界,当前visit数组未被访问过,当前字符和word相对应字符相同
            if(x >= 0 && x < m && y >=0 && y < n && visit[x][y] == false && word[pos] == board[x][y])
            {
                visit[x][y] = true; // 先定义到访问过
                if(dfs(board, x, y, word, pos + 1)) return true; // 递归下一层
                visit[x][y] = false; // 恢复现场
            }
        }
        return false;
    }
};

3、解析

在这里插入图片描述

三、黄金矿工

1、题目描述

leetcode链接

在这里插入图片描述

2、代码

class Solution 
{
public:
    // 全局变量
    bool visit[16][16]; // 标记是否访问过
    int m, n; // m是行,n是列
    int sum; // 总和
    int path; // 每次走的路径
    int getMaximumGold(vector<vector<int>>& grid) 
    {
        m = grid.size();
        n = grid[0].size();
        for(int i = 0; i < m; i++)
        {
            for(int j = 0; j < n; j++)
            {
                if(grid[i][j] != 0) // 先找到第一个非零元素
                {
                    visit[i][j] = true; // 标记一下访问过了
                    path += grid[i][j]; // 路径加上
                    dfs(grid, i, j, path); // 递归
                    visit[i][j] = false; // 找下一个非零元素
                    path -= grid[i][j];
                } 
            }
        }
        return sum;
    }
    int dx[4] = {0, 0, 1, -1}; // 上下左右
    int dy[4] = {1, -1, 0, 0}; // 上下左右
    void dfs(vector<vector<int>>& grid, int i, int j, int path)
    {
        // 递归出口
        sum = max(sum, path); // 这里直接用算法max找最大值

        for(int k = 0; k < 4; k++)
        {
            int x = dx[k] + i; // 向量x
            int y = dy[k] + j; // 向量y
            if(x >= 0 && x < m && y >= 0 && y < n && visit[x][y] == false && grid[x][y] != 0)
            {
                visit[x][y] = true;
                path = path + grid[x][y]; // 路径加上
                dfs(grid, x, y, path);
                visit[x][y] = false; // 恢复现场
                path = path - grid[x][y];
            }
        }
    }
};

3、解析

在这里插入图片描述

四、不同路径III

1、题目描述

leetcode链接

在这里插入图片描述

2、代码

class Solution 
{
public:
    // 全局变量
    int m, n;
    bool visit[21][21]; // 用来记录位置是否被访问过
    int dx[4] = {0, 0, 1, -1};
    int dy[4] = {1, -1, 0, 0};
    int ret; // 统计总路数
    int step; // 记录总共有几个0
    int uniquePathsIII(vector<vector<int>>& grid) 
    {
        m = grid.size(); // 行
        n = grid[0].size(); // 列
        int x = 0; // 记录1的横坐标
        int y = 0; // 记录1的纵坐标
        for(int i = 0; i < m; i++)
        {
            for(int j = 0; j < n; j++)
            {
                if(grid[i][j] == 0)
                {
                    step++; // 统计有几个0
                }
                else if(grid[i][j] == 1) // 找到开头
                {
                    x = i;
                    y = j;
                }
            }
        }
        step += 2; // 包含上首尾
        visit[x][y] = true; // 标记一下当前位置被使用过
        dfs(grid, x, y, 1); // 从第一层开始往后递归
        return ret;
    }
    void dfs(vector<vector<int>>& grid, int i, int j, int count/*用来记录每一条路线的0的个数*/)
    {
        // 递归出口
        if(grid[i][j] == 2)
        {
            if(count == step)
            {
                ret++;
            }
            return;
        }
        for(int k = 0; k < 4; k++)
        {
            int x = i + dx[k];
            int y = j + dy[k];
            if(x >= 0 && x < m && y >= 0 && y < n && !visit[x][y] && grid[x][y] != -1)
            {
                visit[x][y] = true;
                dfs(grid, x, y, count + 1);
                visit[x][y] = false;
            }
        }
    }
};

3、解析

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习西瓜书之决策树

目录 算法原理剪枝处理连续值处理缺失值处理多变量决策树 算法原理 从逻辑角度&#xff1a;通过一系列if-else语句进行多重判断&#xff0c;比如白富美的判断条件&#xff08;“白”“富”“美”&#xff09;。 从几何角度&#xff1a;根据定义的标准进行样本空间的划分。 以二…

如何在CSS中实现背景图片的渐变?

--引言 在CSS中&#xff0c;实现背景图片的渐变通常需要使用linear-gradient或者radial-gradient函数&#xff0c;这些函数可以与背景图像一起使用来创建渐变效果。然而&#xff0c;CSS的渐变并不直接支持使用图像作为渐变的颜色停止点。但你可以通过一些技巧来实现类似的效果…

每日一题 429.N叉树的层序遍历

429. N 叉树的层序遍历 描述&#xff1a; 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 null 值分隔&#xff08;参见示例&#xff09;。 示例 1…

谷歌新动作:双子模型大放送,开发者福音来了!

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

SQL29 计算用户的平均次日留存率(lead函数的用法)

代码 with t1 as(select distinct device_id,date --去重防止单日多次答题的情况from question_practice_detail ) select avg(if(datediff(date2,date1)1,1,0)) as avg_ret from (selectdistinct device_id,date as date1,lead(date) over(partition by device_id order by d…

神经网络学习小记录78——Keras CA(Coordinate attention)注意力机制的解析与代码详解

神经网络学习小记录78——Keras CA&#xff08;Coordinate attention&#xff09;注意力机制的解析与代码详解 学习前言代码下载CA注意力机制的概念与实现注意力机制的应用 学习前言 CA注意力机制是最近提出的一种注意力机制&#xff0c;全面关注特征层的空间信息和通道信息。…

走近 Next.js:全栈框架的简介与应用

微信搜索“好朋友乐平”关注公众号。 1. Next.js Next.js 是一个使用 React 构建单页应用程序&#xff08;SPA&#xff09;的开源 JavaScript 框架。它使得构建服务端渲染&#xff08;SSR&#xff09;和静态网站生成&#xff08;SSG&#xff09;的 React 应用程序变得简单和高…

安全基础~通用漏洞5

文章目录 知识补充CSRFSSRFxss与csrf结合创建管理员账号 知识补充 NAT&#xff1a;网络地址转换&#xff0c;可以将IP数据报文头中的IP地址转换为另一个IP地址&#xff0c;并通过转换端口号达到地址重用的目的。即通过将一个外部IP地址和端口映射更大的内部IP地址集来转换IP地…

人工智能学习与实训笔记(七):神经网络之模型压缩与知识蒸馏

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 七、模型压缩与知识蒸馏 7.1 模型压缩 7.2 知识蒸馏 7.2.1 知识蒸馏的原理 7.2.2 知识蒸馏的种类 7.2.3 知识蒸馏的作用 七、模型压缩与知识蒸馏 出于对响应速度&#xff0c;存储大小和能…

鸿蒙应用开发工程师招聘多吗?工资有多少呢?

随着鸿蒙操作系统的快速普及&#xff0c;越来越多的企业开始重视鸿蒙应用开发人才的培养和引进。那么&#xff0c;目前市场上鸿蒙应用开发工程师招聘多吗&#xff1f;工资有多少呢&#xff1f; 首先&#xff0c;我们来了解一下鸿蒙应用开发工程师的招聘情况。随着鸿蒙操作系统…

IEEE Internet of Things Journal投稿经验

期刊名&#xff1a;IEEE Internet of Things Journal 期刊分区&#xff1a;中科院一区 Top 影响因子&#xff1a;10.6 投稿状态 &#xff08;1&#xff09;2023.11.3&#xff0c;投稿成功&#xff0c;状态为&#xff1a;under review&#xff08;大u大r&#xff09;&#xff1…

无心剑小诗《爱的迷宫》

爱的迷宫 在心海深处悄然铺陈 情感线索纷乱中交织缠绵 一道道的拐角&#xff0c;星云的光辉 指引渴望的心追寻那深邃的真理 曲折通道&#xff0c;每次心跳 爱的重奏在无边探寻里 每一寸肌肤与每一根神经 都铭记你的气息&#xff0c;你的轮廓 迷宫的幻影&#xff0c;无尽的梦…

掌上新闻随心播控,HarmonyOS SDK助力新浪新闻打造精致易用的资讯服务新体验

原生智能是HarmonyOS NEXT的核心亮点之一&#xff0c;依托HarmonyOS SDK丰富全面的开放能力&#xff0c;开发者只需通过几行代码&#xff0c;即可快速实现AI功能。新浪新闻作为鸿蒙原生应用开发的先行者之一&#xff0c;从有声资讯入手&#xff0c;将基于Speech Kit朗读控件上线…

什么软件可以监控电脑屏幕?

随着信息技术的飞速发展&#xff0c;电脑已成为企业日常运营不可或缺的工具。然而&#xff0c;这也带来了一系列的管理挑战&#xff0c;如何确保员工高效工作、避免信息泄露、监控不当行为等成为了企业迫切需要解决的问题。在这种背景下&#xff0c;电脑屏幕监控软件应运而生&a…

基于Springboot+Vue实现的宿舍管理系统

基于SpringbootVue的宿舍管理系统 1.系统相关性介绍1.1 系统架构1.2 设计思路 2.功能模块介绍2.1 用户信息模块2.2 宿舍管理模块2.3 信息管理模块 3. 源码获取以及远程部署 前言&#xff1a; 在现代教育环境中&#xff0c;学生宿舍的管理显得尤为重要&#xff0c;需要一套能…

明年再见了,

过年家里待了好天&#xff0c;也停更了好些天&#xff0c;明天准备启程回深。 年前跟朋友kt聊天&#xff0c;他先是跟我说了他的投资方向「这是一件非常隐秘的事情」&#xff0c;也说了他对我的建议&#xff0c;2024年也想有新的计划&#xff0c;今年也计划减少更新文章频率&am…

DNS出现问题了,怎么处理?-提供完整解决方案

DNS作用 将域名(网址)解析为IP地址 DNS的作用是将域名(网址)解析为IP地址,方便用户访问互联网。通过DNS,用户可以轻松地通过域名来获取对应的IP地址,无需记住复杂的数字串。 负载均衡 负载均衡是DNS的一种功能,它能够将访问请求转发到不同的服务器,从而实现负载均衡。…

【网站项目】154智能无人仓库管理

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

2024年通信安全员ABC证证模拟考试题库及通信安全员ABC证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年通信安全员ABC证证模拟考试题库及通信安全员ABC证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;通信安全员ABC证证模拟考试题库是根据通信安全员ABC证最新版教材&#xff0c;通信安全员ABC证大纲整理…