【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+1int dy[4] = {1, -1, 0, 0}; // y+1 y-1 y ybool 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; // 向量xint y = dy[k] + j; // 向量yif(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; // 记录总共有几个0int 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、解析

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MCU电源控制(PWR)与低功耗

目录 一、STM32 的内核和外设电源系统管理&#xff1a; 二、MCU电源监控&#xff1a; 三、三种低功耗模式&#xff1a; 1、睡眠模式&#xff1a; 2、停止模式&#xff1a; 3、待机模式&#xff1a; 一、STM32 的内核和外设电源系统管理&#xff1a; ① 电池备份区域&#…

力扣OJ题——旋转数组

题目&#xff1a;189.旋转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数 思路一&#xff1a; 1.每次挪动旋转1位&#xff08;用tmp将最后一位存起来&#xff0c;其余所有数据向后移&#xff0c;然后将tmp放在第一个位…

语音唤醒——

文章目录 配置主代码 参考文档&#xff1a;https://picovoice.ai/docs/quick-start/porcupine-python/ 配置 pip install pvporcupine主代码 ACCESS_KEY&#xff1a;需要将该参数填入即可 # # Copyright 2018-2023 Picovoice Inc. # # You may not use this file except in …

数据库设计、JDBC、数据库连接池

数据库设计 数据库设计概念 数据库设计就是根据业务 系统的具体需求&#xff0c;结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。建立数据库中的表结构以及表与表之间的关联关系的过程。有哪些表?表里有哪些字段?表和表之间有什么关系? 数据库设计的步骤…

WordPress站点成功升级后的介绍页地址是什么?

我们一般在WordPress站点后台 >> 仪表盘 >> 更新中成功升级WordPress的话&#xff0c;最后打开的就是升级之后的版本介绍页。比如boke112百科前两天升级到WordPress 6.4.2后显示的介绍页如下图所示&#xff1a; 该介绍除了介绍当前版本修复了多少个问题及修补了多少…

图数据库、知识图谱、装配模型

一、图数据库 图数据库简介 ​ 图数据库&#xff08;Graph Database&#xff09;是基于图论实现的一种新型NoSQL数据库。它的数据存储结构和数据的查询方式都是以图论为基础的。图论中图的基本元素为节点和边&#xff0c;在图数据库中对应的就是节点和关系。 图数据库是基于图…

Transformer——Attention 注意力机制

注意力机制 Transformer的注意力机制借鉴了人类的注意力机制。人类通过眼睛的视觉单元去扫描图像&#xff0c;其中的重点区域会被大脑的神经元处理从而获得更多的信息&#xff0c;这是人类长期精华所获得的一种能力。 以论文中的例子来看&#xff0c;红色区域表示我们人脑视觉…

C++并发编程 -3.同步并发操作

本文介绍如何使用条件变量控制并发的同步操作、C 并发三剑客&#xff0c;函数式编程 一.条件变量 1.概念 C条件变量&#xff08;condition variable&#xff09;是一种多线程编程中常用的同步机制&#xff0c;用于线程间的通信和协调。它允许一个或多个线程等待某个条件的发生…

HTTP 请求 400错误

问题 HTTP 请求 400错误 详细问题 客户端发送请求 public static UserInfo updateUserInfo(UserInfo userInfo) {// 创建 OkHttpClient 对象OkHttpClient client new OkHttpClient();// 创建请求体MediaType JSON MediaType.parse("application/json; charsetutf-8&…

- 项目落地 - 《选择项目工具的方法论》

本文属于专栏《构建工业级QPS百万级服务》 提纲&#xff1a; 选择大概率能完成业务目标的工具选择最适合的工具制作最适合的工具 本文所说的项目工具&#xff0c;泛指业务软件开发&#xff0c;所依赖的第三方提供的成熟的资源。包括但不限于开发语言、编辑工具、编译工具、三方…

python in Vscode

背景 对于后端的语言选择&#xff1a; python&#xff0c;java&#xff0c;JavaScript备选。 选择Python 原因&#xff1a;可能是非IT专业的人中&#xff0c;会Python的人比较多。 目的 之前使用的IDE是VSCODE&#xff0c;在WSL的环境下使用。现在需要在在WSL的VSCODE下使…

数据集合

目录 并集 union union all 区别 交集 intersect 差集 minus 错误操作 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 常用的数学集合有&#xff1a;交集、并集、差集、补集 每一次查询实际上都会返回数据集合&#xff0c;…