矩阵中的路径

一、题目

请设计一个函数,用来判断在一个矩阵中是否存在一条路径包含的字符按访问顺序连在一起恰好为给定字符串。

路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。

如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。

注意:

  • 输入的路径字符串不为空;
  • 所有出现的字符均为大写英文字母;
数据范围

矩阵中元素的总个数 [0,900][0,900]。
路径字符串的总长度 [1,900][1,900]。

matrix=
[["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]
]str="BCCE" , return "true" str="ASAE" , return "false"

 二、思路

以矩阵的每个元素为起点,开始搜索,如果能找到完整的str,说明true,否则false。

搜索思路:用一个下标记录当前的str下标,

先判断当前在矩阵中的这个字母与字符串中的字母是否匹配,如果不匹配,也不用继续往下找字符串的其他字母了,直接false。

如果当前这个下标为str的最后一个位置,直接返回true,说明整个str都连续找到了。

如果当前下标不是最后一个位置,就按照四个方向走,找下一个字符串中的字母是否能在矩阵中找到(按照走的规则,不是有就行),还要注意不能走回头路,也就是边走边要做标记。

如果查找中断,这条路径不成立,按照深搜的特点,做还原就好,并返回false。

三、代码实现

话不多说,上代码,注释为自己写的,代码是大佬教的!

class Solution {
public:bool hasPath(vector<vector<char>>& matrix, string &str) {//首先在这个里面,以矩阵的每个元素为起点搜索for(int i = 0;i < matrix.size();i ++)for(int j = 0;j < matrix[i].size();j ++)if(dfs(matrix, str, 0, i, j)) return true;return false;}bool dfs(vector<vector<char>> &matrix,string str,int cur,int x,int y){//cur表示当前查找str的元素下标 x,y为矩阵的下标 定位矩阵中元素//当前这个位置的矩阵的元素 与字符串的当前遍历到的位置元素不相等 直接返回falseif(matrix[x][y] != str[cur]) return false;//表示str的最后一个元素都在矩阵中找到了 返回trueif(cur == str.size() - 1) return true;//搜索//保存当前的元素 方便后续还原char t = matrix[x][y];//将走过的位置设置为# 设置为一个不会出现的元素 防止走回头路matrix[x][y] = '#';//定义四个方向int dx[4] = {1, 0, -1, 0},dy[4] = {0, -1, 0, 1};for(int i = 0;i < 4;i ++){//开始四个方向的找int a = x + dx[i],b = y + dy[i];if(a >= 0 && a < matrix.size() && b >= 0 && b < matrix[a].size())if(dfs(matrix, str, cur + 1, a, b)) return true;}//没找到 还原 返回false 换条路走 说明以这个点为起点的四个方向 都不能正常找到完整的str 查找失败matrix[x][y] = t;return false;}
};

四、总结

感觉自己写完文章后对代码的理解更深入了,不过还是得多练习,才能在做题的时候想到深搜的模板,详细的讲解也便于自己今后回头复习,谢谢大家观看!

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

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

相关文章

Sentinel与Nacos强强联合,构建微服务稳定性基石的重要实践

一、简介 Sentinel 作为一款强大的流量控制组件&#xff0c;能够对系统入口流量进行精准控制&#xff0c;有效防止服务因突发流量冲击引起服务雪崩&#xff0c;进而导致服务瘫痪&#xff0c;确保服务的稳定性和可靠性。 Nacos 作为配置管理和服务发现平台&#xff0c;实现了配置…

高斯混合模型聚类算法的实现

目录 1. 作者介绍2. 聚类简介2.1 K-Means聚类简介2.2 高斯混合聚类简介 3. 实验过程3.1 数据集介绍3.2 代码思路3.3 算法评价3.4 代码实现3.5 实验结果 4. 参考链接 1. 作者介绍 赵子仪&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2023级研究生 研究方向&…

深度网络学习笔记(一)——self-attention机制介绍和计算步骤

self-attention机制介绍及其计算步骤 前言一、介绍和意义二、 计算细节2.1 计算Attention Score2.2 计算value2.3 计算关联结果b2.4 统一计算 三、总结 前言 Transformer是一种非常常见且强大的深度学习网络架构&#xff0c;尤其擅长处理输出为可变长度向量序列的任务&#xf…

低空经济重要意义

1. 推动经济高质量发展&#xff1a;低空经济作为新质生产力的代表&#xff0c;产业链条长、成长性好、市场空间大、绿色环保&#xff0c;有助于培育竞争新优势、打造增长新引擎、增强发展新动能。 2. 促进产业结构优化升级&#xff1a;低空经济的发展有助于推动相关产业的快速…

网络原理———TCP/IP—网络层IP协议

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 目录 网络层IP协议4位版本号4位首部长度8位服务类型16位总长度16位标识 3位标志 13位片偏移8位生存时间8位协议16位首部校验和32位源IP地址 和 32位目的IP地址方案1:动态分配IP地址方案2:NAT机…

小白跟做江科大32单片机之旋转编码器计次

原理部分按照下面这个链接理解即可y小白跟做江科大32单片机之对射式红外传感器计次-CSDN博客https://blog.csdn.net/weixin_58051657/article/details/139350487https://blog.csdn.net/weixin_58051657/article/details/139350487 实验过程 1.按照江科大老师给的电路图进行连接…

C语言(内存函数)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…

第十四章 创建Web客户端 - XML 命名空间的 SOAP 向导选项

文章目录 第十四章 创建Web客户端 - XML 命名空间的 SOAP 向导选项XML 命名空间的 SOAP 向导选项添加 NAMESPACE 类参数对文档样式 Web 方法使用未包装的消息格式不创建数组属性为可为 null 的元素生成 XMLNIL 属性参数为可为 nillable 元素生成 XMLNILNOOBJECT 属性参数将 XML…

基于Open3D的点云处理20- 基于Visualizer类自定义可视化

1. 自定义可视化 官网测试用例 Open3D/examples/python/visualization/customized_visualization.py 自定义可视化工具窗口-Visualizer 类 Visualizer 可视化基础操作def custom_draw_geometry(pcd):# The following code achieves the same effect as:# o3d.visualization.d…

springboot+vue+mybatis博物馆售票系统+PPT+论文+讲解+售后

如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统博物馆售票系统信息管理难度大&#xff0c;容错率低&#xff0c;…

Minio的图片下载

一 为什么要写下载? 正常使用Minio的时候,其实是不用单独再写下载功能的,因为使用Minio上传的时候,可以再返回结果里带上地址,可直接点击地址进行下载,可如果现在既要预览又要下载,就需要单独写一个下载功能. 1 代码如下 Minio使用的初始化 private void init() {minioClien…

【思考】服务的吞吐量与请求耗时的关系

吞吐量即服务1s内可以处理的最大请求数&#xff0c;即最大可以支撑的QPS&#xff1b;请求耗时就更好理解了&#xff0c;即处理一次请求所需要耗费的时间。 明显这两个指标都是用来衡量服务的性能的&#xff0c;但两者之间的关系是什么呢&#xff1f;他们之间是否存在一些相互的…

spdlog日志库源码:输出通道sink

概述 在 spdlog 日志库中&#xff0c;sinks 并不是一个单独的类&#xff0c;而是一系列类的集合&#xff0c;这些类以基类-派生类的形式组织&#xff0c;每一个 sink 派生类代表了一种输出日志消息的方式。输出目标可以是普通文件、标准输出 (stdout)、标准错误输出 (stderr)、…

sqoop操作

介绍 sqoop是隶属于Apache旗下的, 最早是属于cloudera公司的,是一个用户进行数据的导入导出的工具, 主要是将关系型的数据库(MySQL, oracle...)导入到hadoop生态圈(HDFS,HIVE,Hbase...) , 以及将hadoop生态圈数据导出到关系型数据库中 操作 将数据从mysql中导入到HDFS中 1.全量…

Pytest框架中的Setup和Teardown功能

在 pytest 测试框架中&#xff0c;setup 和 teardown是用于在每个测试函数之前和之后执行设置和清理的动作&#xff0c;而pytest 实际上并没有内置的 setup 和 teardown 函数&#xff0c;而是使用了一些装饰器或钩子函数来实现类似的功能。 学习目录 钩子函数&#xff08;Hook…

详解 Scala 的模式匹配

一、基本语法 Scala 中的模式匹配类似于 Java 中的 switch 语法&#xff0c;但是功能更强大 /**[var a / def func() ] var_name match {case value1 > statement1case value2 > statement2case value3 > statement3case _ > defaultOP} */ object TestMatchCase…

Python——cv2 判断图像读取内容是否为空

import cv2 pic_path"xxx.jpg" imagecv2.imread(pic_path) if None image:print("图片为空") else:print("图片不为空")

ubuntu上zsh与bash切换

在Ubuntu上切换zsh和bash&#xff0c;你可以使用命令行。 切换到zsh: chsh -s $(which zsh)切换回bash: chsh -s $(which bash)注意&#xff1a;chsh命令可能需要你输入你的用户密码。 如果你想立即启动新shell&#xff0c;而不用重启&#xff0c;可以运行&#xff1a; ex…

java中的线程安全的容器

ReentrantLock 和 Condition 都是基于 AbstractQueuedSynchronizer (AQS) 实现的。 以下是 ReentrantLock 与 AQS 的关系&#xff1a; ReentrantLock 状态管理&#xff1a;ReentrantLock 通过 AQS 的 state 变量来表示锁的状态。状态为 0 表示锁未被持有&#xff0c;状态为 1…

【python】YOLO目标检测txt标签转xml,支持与原xml标签融合

需求&#xff1a; 利用现有yolo模型权重实现自动标注功能&#xff0c;即使用yolov5源码中的detect.py对待标注图像执行推理任务&#xff0c;并使用--save-txt保存标签文件&#xff0c;然后使用本文python代码直接将detect.py生成的txt标签转为xml标签&#xff0c;最后再使用la…