【递归、搜索与回溯】综合练习四

综合练习四

  • 1.单词搜索
  • 2.黄金矿工
  • 3.不同路径 III

在这里插入图片描述

点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃

1.单词搜索

题目链接:79. 单词搜索

题目分析:

在这里插入图片描述

给一个mxn board二维数组,让在数组中找是否存在字符串单词 word,注意只能上下左右去找,不能斜着找。

算法原理:
我们在这个矩阵中依次找到word里面的所有字符。首先在这个矩阵里面先一行一行的扫描找到word里面第一个字符,当找到第一个字符时,就从这个字符开始去匹配其他剩余的字符,注意只能上下左右去匹配,如果上下左右都不匹配说明这个位置是一次失败的匹配。那就在去找其他位置能匹配的第一个字符。如果找到还是上下左右去匹配,如果能匹配成功说明这个矩阵有这个单词。

在这里插入图片描述

如果把这道题抽象一下,你会发现刚刚的过程j就是解决迷宫常用的方式,深度优先遍历。如果走不通就回溯一下再往下走,直到找到一个正确结果为止。

在这里插入图片描述
接下来我们考虑递归函数如何设计,从某个节点开始上下左右匹配下一个字符,所以则函数体干的就是给一个位置然后上下左右去匹配下一个字符。这个参数首先把这个board给我,然后第一个字符的位置,然后给我要匹配字符串中下一个字符的位置。dfs(board,i,j,s,pos),注意看这个决策树我们从一个位置走可能走失败,上面调用dfs的得知道是找成功还是失败,所以dfs有一个bool类型的返回值,
bool dfs(board,i,j,s,pos) 失败就去另一条路径。剪枝就是那一个位置能匹配就去走那一个位置。回溯 一条路径找失败往上走就是回溯,往下走之前你弄了什么,反着来就可以了。

下面是细节问题:二维矩阵搜索中,经常要注意的细节。
不能走重复的路
就比如下面的这个位置,一直会是重复的。之前用过的下一次不能在找了。
在这里插入图片描述
这里我们有两种方法规避。

  1. 搞一个bool类型的跟原始数组大小一样的二维数组 bool visit[][]。用这个数组来标记当前这个位置是否被使用过。使用过就把这个位置标记成true。然后到下一层的时候就考虑一下上一个位置是否是ture,是就不走,不是就可以走。
  2. 修改原始矩阵的值。 比如说把被使用的位置的值修改成*,面试时还是要问一下能否修改,能修改再用这种方法。但是还有一个问题你修改完去往下一层,然后再回来的时候你要把被修改的值在还原回来。

这里在写代码去上下左右匹配的时候有两种写法:

  1. 可以分别写上下左右四个函数去匹配。
  2. 我们可以用向量的方式,定义上下左右四个位置。 然后仅需一次for循环就可以把上下左右都考虑进去了。

单独看这个i,上下左右就是在原始的i基础上要么不变,要么+1,要么-1,所以可以搞一个数组 int dx[4]={0,0,1,-1}; 这个表示i接下来可能的偏移量。同理j也有四个偏移量 int dy[4]={-1,1,0,0}; 然后这两个就可以上下凑一起使用。
在这里插入图片描述

class Solution {bool check[7][7];int m,n;
public: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(board[i][j] == word[0]){check[i][j]=true;if(dfs(board,i,j,word,1)) return true;check[i][j]=false;}}}return false;}int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0};bool dfs(vector<vector<char>>& board,int i,int j,string& s,int pos){if(pos == s.size()) return true;for(int k = 0; k < 4; ++k){int x=i+dx[k],y=j+dy[k];if(x >= 0 && x < m && y >= 0 && y < n && check[x][y] == false && board[x][y] == s[pos]){check[x][y]=true;if(dfs(board,x,y,s,pos+1)) return true;check[x][y]=false;}}return false;}};

2.黄金矿工

题目链接:1219. 黄金矿工

题目分析:

在这里插入图片描述

这道题和上面单词搜索就是同属于一类题,这里也是上下左右去搜索,不能走重复路。当天这里还有要求不能开采为0的单元格。

算法原理:
我们还是先去遍历找到不为0的单元格,然后从这个位置开始上下左右去递归,注意已经被选过的下次不能在选,可以弄一个原数组大小bool类型二维数组,当然也可以修改原始的值。其余的几乎和上面题一模一样。
在这里插入图片描述
修改原始的值

class Solution {int m,n,ret;
public: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){int num=grid[i][j];grid[i][j]=0;dfs(grid,i,j,num);grid[i][j]=num;}}}return ret;}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){//每次递归进来就统计,不用硬找递归出口ret=max(ret,path);for(int k = 0; k < 4; ++k){int x=i+dx[k],y=j+dy[k];if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] != 0){int num=grid[x][y];grid[x][y]=0;dfs(grid,x,y,path+num);grid[x][y]=num;}}}
};
class Solution
{bool vis[16][16];int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int m, n;int ret;
public:int getMaximumGold(vector<vector<int>>& grid) {m = g.size(), n = g[0].size();for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(grid[i][j]){vis[i][j] = true;dfs(grid, i, j, grid[i][j]);vis[i][j] = false;}}}return ret;}void dfs(vector<vector<int>>& grid, int i, int j, int path){ret = max(ret, path);for(int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y]){vis[x][y] = true;dfs(grid, x, y, path + grid[x][y]);vis[x][y] = false;}}}
};

3.不同路径 III

题目链接:980. 不同路径 III

题目分析:

在这里插入图片描述

这个棋盘,1代表开始,2代表结束,0表示可以走过的方格,-1表示障碍。
从开始到结束有很多的走法,但是仅有两种路径把所有0方格都通过一次。

在这里插入图片描述
算法原理:
我们策略就是把从1走到2所有合法的路径个数统计出来。我们可以先扫描出数组找到起始位置,然后从这个起始位置开始dfs,不管你怎么走的,只要走到2你这条路径是合法的就行了。如何判断合法特别简单,向下递归的时候用一个count变量记录一下从开始到结束所走的这条路径个数。当走到2的时候判断一下这个count和我实际要走的步数step是否一样,实际要走步数在dfs之前把先描述整个数组先统计这个数组0有多少个,然后在加上起始位置和结束位置就是实际要走的步数。如果走到2 count == step 就找到一条路径。不相等就不统计。然后继续暴搜直到把所有能到2的路径合法的统计出来。

class Solution {bool vis[21][21];int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int m,n;int ret,step;
public:int uniquePathsIII(vector<vector<int>>& grid) {m=grid.size(),n=grid[0].size();int beginx,beginy;// 统计0的个数 以及 开始的地方for(int i = 0; i < m; ++i){for(int j = 0; j < n ; ++j){if(grid[i][j] == 0) ++step;else if(grid[i][j] == 1) {beginx=i;beginy=j;}}}// 到底终点所需步数step += 2;vis[beginx][beginy]=true;dfs(grid,beginx,beginy,1);return ret;}void dfs(vector<vector<int>>& grid,int i,int j,int count){if(grid[i][j] == 2) {if(count == step) //判断是否合法++ret;return;}for(int k = 0; k < 4; ++k){int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] != -1){vis[x][y]=true;dfs(grid,x,y,count+1);vis[x][y]=false;}}}
};

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

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

相关文章

杨辉三角的快速求法

一、杨辉三角形 杨辉三角形&#xff0c;又称贾宪三角形&#xff0c;帕斯卡三角形&#xff0c;是二项式系数在三角形中的一种几何排列&#xff0c;是二项式系数在三角形中的一种几何排列&#xff0c;古称“开方作法本源图”。 杨辉三角的历史 北宋人贾宪约1050年首先使用“贾…

2024年,计算机相关专业依旧是热门选择吗?未来趋势大揭秘!

文章目录 引言一、行业竞争现状二、专业与个人的匹配度判断三、专业前景分析总结 引言 在科技日新月异的今天&#xff0c;计算机专业一直以其强大的实用性和广阔的就业前景吸引着无数学子的目光。然而&#xff0c;随着人工智能、大数据、云计算等领域的飞速发展&#xff0c;我…

「51媒体」活动会议,展览展会,直播曝光的一种方法

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 我们在做活动会议&#xff0c;或者参加展览展会&#xff0c;需要进行直播的时候&#xff0c;可以通过一键同步多个媒体平台的方法&#xff0c;来扩大曝光&#xff0c;比如一场直播我们可…

FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg

《FFmpeg开发实战&#xff1a;从零基础到短视频上线》一书的“第11章 FFmpeg的桌面开发”介绍了如何在Windows环境对Qt结合FFmpeg实现桌面程序&#xff0c;那么Windows系统通过Visual Studio开发桌面程序也是很常见的&#xff0c;下面就介绍如何在Visual Studio的C工程中集成F…

弃用Docker Desktop:在WSL2中玩转Docker之Docker Engine 部署与WSL入门

Docker技术概论 在WSL2中玩转Docker之Docker Engine部署 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://bl…

【unity笔记】四、Enviro- Sky and Weather插件使用

一、 简介 Enviro内置 RP、URP、HDRP&#xff0c;开箱即用。 动态天空 随附的天空系统经过精心设计&#xff0c;以实现最佳性能和灵活性。使用多种颜色渐变&#xff0c;而不是调整人工数字。为您的项目创建独特且非常逼真的天空非常简单&#xff01; 灯光 由 Enviro 控制的逼…

Python学习打卡:day10

day10 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 目录 day1073、文件的读取操作文件的操作步骤open()打开函数mode常用的三种基础访问模式读操作相关方法read()方法readlines()方法readline()方法for循…

计算机组成原理---Cache的基本工作原理习题

对应知识点&#xff1a; Cache的基本原理 1.某存储系统中&#xff0c;主存容量是Cache容量的4096倍&#xff0c;Cache 被分为 64 个块&#xff0c;当主存地址和Cache地址采用直接映射方式时&#xff0c;地址映射表的大小应为&#xff08;&#xff09;(假设不考虑一致维护和替…

LeetCode 算法:删除链表的倒数第 N 个结点 c++

原题链接&#x1f517;&#xff1a;删除链表的倒数第 N 个结点 难度&#xff1a;中等⭐️⭐️ 题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a…

【无线传感网】LEACH路由算法

1、LEACH路由算法简介 LEACH协议,全称是“低功耗自适应集簇分层型协议” (Low Energy Adaptive Clustering Hierarchy),是一种无线传感器网络路由协议。基于LEACH协议的算法,称为LEACH算法。 2、LEACH路由算法的基本思想 LEACH路由协议与以往的路由协议的不同之处在于其改变…

ElasticSearch地理空间数据写入

目录 ElasticSearch地理空间数据写入思路介绍实现(geo_point)数据处理创建点的mappings使用Java将数据写入ES配置maven依赖项目配置ES数据写入查询数据实现(geo_shape)数据处理创建geo_shape的mappings使用Java将数据写入ES数据写入查询数据ElasticSearch地理空间数据写入 申明…

欧拉函数的求解

欧拉函数的定义 欧拉函数的性质 性质1是性质2的特殊情况 性质1的理解&#xff1a;一个数a是质数&#xff0c;前面的数b与a的gcd一定是1 性质2的理解&#xff1a;1,2,…p,p1,p2…2p,…3p…p^k 其中以np结尾的序列重复了p^&#xff08;k-1&#xff09;次&#xff0c;每一次的循环…

HarmonyOS Next 系列之从手机选择图片或拍照上传功能实现(五)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

【设计模式深度剖析】【11】【行为型】【解释器模式】| 以算术表达式求值为例加深理解

&#x1f448;️上一篇:状态模式 设计模式-专栏&#x1f448;️ 文章目录 解释器模式定义英文原话直译 解释器模式中的角色1. 抽象表达式&#xff08;AbstractExpression&#xff09;2. 终端表达式&#xff08;TerminalExpression&#xff09;3. 非终端表达式&#xff08;Non…

6.S081的Lab学习——Lab7: Multithreading

文章目录 前言一、Uthread: switching between threads (moderate)提示&#xff1a;解析 二、Using threads (moderate)解析&#xff1a; 三、Barrier (moderate)解析&#xff1a; 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。打算尝试6.S081&#xff0c;将它的…

[Linux] 文件系统

UNIX操作系统将文件组织成一个有层次的树形结构&#xff1a; 标准目录&#xff1a; 根目录&#xff1a; /tmp目录 主目录&#xff1a; 这就是主目录 一般与系统有关的信息都存放在etc目录下 注意&#xff1a; /etc/passwd存放的是用户账户信息&#xff0c;不是密码信息&#xf…

VMware RedHat虚拟机磁盘扩容(添加磁盘和扩展磁盘)

前言 自己的电脑上配一个虚拟机还是很有必要的&#xff0c;用起来比双系统方便一点&#xff0c;之前搞了100g的ubuntu没用到&#xff0c;后面重装redhat觉得随便搞个20g就够用了&#xff0c;后面用到之后就遇到磁盘不够用的情况&#xff0c;只能说情况允许的话&#xff0c;磁盘…

FPGA生成图像Modelsim仿真生成BMP图片保存显示

FPGA生成图像模板&#xff0c;产生RBG格式棋盘格。利用Modelsim仿真&#xff0c;将FPGA生成的图片转化成BMP图片保存并显示。 一&#xff1a;仿真代码 timescale 1ns/1ps module design_1_wrapper_top (); reg clk_100MHz; reg clk_300MHz; wire [31:0]clk_rate; …

为微信小程序项目添加eslint

背景 在使用vscode开发微信小程序的过程中&#xff0c;修改js的时候发现没有报错提示&#xff0c;让我很不习惯&#xff0c;所以想为微信小程序项目添加eslint配置 编码实战 为微信小程序配置ESLint可以遵循以下步骤&#xff1a; 安装ESLint及其相关插件 首先&#xff0c;…

基于IDEA的Maven(坐标信息介绍和编写)

这篇博客来学习和分析一下&#xff1a; " pom.xml " 所生成的最基本的信息。 之前的博客中讲到&#xff0c;学 Maven 就是学 " pom.xml " 的配置。后面也会围绕这个文件进行学习。 目录 一、分析 pom.xml 文件 &#xff08;1&#xff09;分析的 "p…