DFS求解迷宫最长移动路线

来源:十四届蓝桥杯STEMA考试Python真题试卷第二套编程第五题
本文给出了C++实现代码,介绍了 STL 中容器vectorpairunordered_set 的应用,供信奥选手参考。迷宫类问题适合用DFS算法解决,本文最后总结了DFS算法的两种常见实现方式——递归实现、栈实现,应用场景——迷宫类问题、图的连通性、树的遍历、拓朴排序、排列组合,以及主要优缺点。

题目描述

有一个 N*M 的矩阵,且矩阵中的每个方格都有一个整数(0≤整数≤100),小蓝需要按照以下要求从矩阵中找出一条最长的移动路线,且输出最长路线的长度(1 个方格为 1 个长度)。

要求:
1.小蓝可以从矩阵中任意一个方格开始向它的上、下、左、右相邻的任意一个方格移动,且移动的路线不能有交叉;
2.小蓝每次所要移动到的方格中的整数都要小于当前所在方格中的整数(如当前所在的方格中的整数为 3,那么可以移动到数字为 0,1,2 的格子里,不可以移动到数字为 3,4,5…的格子里);

例如:
N=3,M=3,矩阵方格如下:
在这里插入图片描述
最长路线为 4 -> 3 -> 2 -> 1,故路线长度为 4。

输入描述:
第一行输入两个正整数 N,M(1<N≤1000,1<M≤1000),N 表示矩阵的行数,M 表示矩阵的列数,两个正整数之间以一个空格隔开
第二行开始输入 N 行,每行包含 M 个整数(0≤每个整数≤100),表示每个方格中的整数,每个整数之间以一个空格隔开

输出描述:
输出一个整数,表示最长路线的长度

样例输入:

3 3
1 1 3
2 3 4
1 1 1

样例输出:

4

参考答案

方法一

#include <iostream>
#include <vector>
#include <unordered_set>
#include <algorithm>using namespace std;struct PairHash {template <class T1, class T2>size_t operator()(const pair<T1, T2>& p) const {auto h1 = hash<T1>{}(p.first);auto h2 = hash<T2>{}(p.second);return h1 ^ (h2 << 1);}
};int dfs(int i, int j, unordered_set<pair<int, int>, PairHash>& visited, vector<vector<int>>& matrix, int rows, int cols) {// 1. 基本状态: 当前位置已经计入路径长度int current_length = 1;// 2. 定义四个移动方向: 上、下、左、右vector<pair<int, int>> directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};// 3. 遍历每个可能的移动方向for (const auto& dir : directions) {// 计算新位置的坐标int ni = i + dir.first;int nj = j + dir.second;// 4. 检查移动的合法性if (ni >= 0 && ni < rows &&     // 检查行是否越界nj >= 0 && nj < cols &&     // 检查列是否越界visited.find({ni, nj}) == visited.end() &&  // 检查是否已访问matrix[ni][nj] < matrix[i][j]) {           // 检查数字是否更小// 5. 递归探索visited.insert({ni, nj});    // 标记已访问// 计算包含当前位置的最长路径current_length = max(current_length, 1 + dfs(ni, nj, visited, matrix, rows, cols));visited.erase({ni, nj});     // 回溯,移除访问标记}}return current_length;
}int longestPath(vector<vector<int>>& matrix) {int rows = matrix.size();int cols = matrix[0].size();int max_length = 0;// 6. 遍历矩阵中的每个位置作为起点for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {unordered_set<pair<int, int>, PairHash> visited;visited.insert({i, j});  // 初始位置标记为已访问int length = dfs(i, j, visited, matrix, rows, cols);max_length = max(max_length, length);}}return max_length;
}int main() {int N, M;cin >> N >> M;// 读取输入矩阵vector<vector<int>> matrix(N, vector<int>(M));for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {cin >> matrix[i][j];}}// 计算并输出结果int result = longestPath(matrix);cout << result << endl;return 0;
}

方法二

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int dfs(int i, int j, vector<vector<bool>>& visited, vector<vector<int>>& matrix, int rows, int cols) {int current_length = 1;vector<pair<int, int>> directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};for (const auto& dir : directions) {int ni = i + dir.first;int nj = j + dir.second;if (ni >= 0 && ni < rows &&     // 检查行是否越界nj >= 0 && nj < cols &&     // 检查列是否越界!visited[ni][nj] &&         // 检查是否已访问matrix

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

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

相关文章

【react使用AES对称加密的实现】

react使用AES对称加密的实现 前言使用CryptoJS库密钥存放加密方法解密方法结语 前言 项目中要求敏感信息怕被抓包泄密必须进行加密传输处理&#xff0c;普通的md5加密虽然能解决传输问题&#xff0c;但是项目中有权限的用户是需要查看数据进行查询的&#xff0c;所以就不能直接…

SpringBoot新闻稿件管理系统:架构与实现

3系统分析 3.1可行性分析 通过对本新闻稿件管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本新闻稿件管理系统采用SSM框架&#xff0c;JAVA作为开发语…

光耦合器的关键作用和创新---腾恩科技

光耦合器或光隔离器已成为电路中必不可少的器件&#xff0c;它允许信号在无需直接电接触的情况下跨不同电压域传输。这种隔离能力对于保护低压元件免受高压电路的潜在损坏至关重要。本文将仔细研究光耦合器在当今技术中发挥的独特作用&#xff0c;并探讨其在各种应用中不断扩展…

HbuildderX运行到手机或模拟器的Android App基座识别不到设备 mac

寻找模拟器 背景&#xff1a; 运行的是h5&#xff0c;模拟器是网易MuMu。 首先检查一下是否配置dab环境&#xff0c;adb version 配置一下hbuilderX的adb&#xff1a; 将命令输出的路径配置到hbuilderx里面去&#xff0c;然后重启下HbuilderX。 开始安装基座…一直安装不…

使用 Spring Boot 搭建 WebSocket 服务器实现多客户端连接

在 Web 开发中&#xff0c;WebSocket 为客户端和服务端之间提供了实时双向通信的能力。本篇博客介绍如何使用 Spring Boot 快速搭建一个 WebSocket 服务器&#xff0c;并支持多客户端的连接和消息广播。 1. WebSocket 简介 WebSocket 是 HTML5 的一种协议&#xff0c;提供了客…

C# 日志框架 NLog、log4net 和 Serilog对比

文章目录 前言NLog、log4net 和 Serilog 三个框架的详细对比:一、NLog优点:缺点:二、 log4net优点缺点三、Serilog优点缺点四、Serilog使用举例总结前言 NLog、log4net 和 Serilog 三个框架的详细对比: NLog、log4net 和 Serilog 是三个非常流行的 .NET 日志框架,它们各自…

从0开始本地部署大模型

这就开始从0开始本地部署大模型 下载Ollama 下载地址&#xff1a;https://ollama.com/download/windows 适用于MacOS、Linux和Windows&#xff0c;这里我下载Windows的安装包。 直接打开安装包&#xff0c;点击install即可&#xff0c;安装完成后可以在任务栏中看到Ollama程…

RHCSA课后练习3(网络与磁盘)

1、配置网络&#xff1a;为网卡添加一个本网段IPV4地址&#xff0c;x.x.x.123 涉及的知识点 配置网络&#xff1a; ens160&#xff1a;en---表示以太网 wl---表示无线局域网 ww---表示无线广域网 注意&#xff1a;一个网络接口&#xff0c;可以有多个网络连接&#xff0c;但…

Linux:网络协议socket

我们之前学的通信是本地进程间通信&#xff0c;如果我们想在网络间通信的话&#xff0c;就需要用到二者的ip地址&#xff0c;分别被称为源IP地址和目的IP地址&#xff0c;被存入ip数据包中&#xff0c;其次我们还需要遵循一些通信协议。 TCP协议&#xff1a;传输层协议&#x…

相机硬触发

PLC 接线图 通过使用PNP光电感应器 实现相机的硬触发 流程&#xff1a;触发相机拍照 然后相机控制光源触发 完成线路连接后 使用MVS 配置相机硬触发参数 通过 pnp传感器控制 硬触发拍照 检测 在2开项目中 不用在点击执行流程 通过PNP传感器就能触发 扩展&#xff1a; 在VP…

浅谈UI自动化

⭐️前言⭐️ 本篇文章围绕UI自动化来展开&#xff0c;主要内容包括什么是UI自动化&#xff0c;常用的UI自动化框架&#xff0c;UI自动化原理等。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题…

儿童安全座椅行业全面深入分析

儿童安全座椅就是一种专为不同体重&#xff08;或年龄段&#xff09;的儿童设计&#xff0c;将孩子束缚在安全座椅内&#xff0c;能有效提高儿童乘车安全的座椅。欧洲强制性执行标准ECE R44/03的定义是&#xff1a;能够固定到机动车辆上&#xff0c;带有ISOFIX接口、LATCH接口的…

net core Autofac 替换默认的服务容器 DI,微软自动的容器 不支持命名选项的

微软默认的容器&#xff0c;不支持命名选项&#xff0c;同一接口&#xff0c;多个实现。 就不支持了。 配置core 支持Autofac 容器 using Autofac; using Autofac.Extensions.DependencyInjection;namespace WebApplication13 {public interface IMyService{string GetData()…

架构系列---高并发

目录标题 前言宏观架构细节解读第一层 &#xff1a;DNS第二层 &#xff1a; LVS 负载第三层 &#xff1a; Nginx第四层 &#xff1a; Gateway Application并发上限更多方案 业务扩展从域名角度如何承受更大的流量从业务的角度看如何分流大的流量 总结 前言 年轻的时候看到文章…

植被遥感常用反射特征表达

Figure: HDRF Let Ω ′ \Omega Ω′ be the incident solid angle, Ω \Omega Ω is leaving solid angle. Consider the BRDF of a Lamvertian target is 1 π \frac{1}{\pi} π1​, the BRF is 1. The HDRF of a target is defined as: R h e m ( Ω ) Φ r Φ r l a …

使用 MONAI Deploy 在 AMD GPU 上进行全身分割

Total body segmentation using MONAI Deploy on an AMD GPU — ROCm Blogs 2024 年 4 月 4 日 作者&#xff1a; Vara Lakshmi Bayanagari. 医疗开放网络人工智能&#xff08;MONAI&#xff09;是一个开源组织&#xff0c;提供最先进的医疗成像模型的 PyTorch 实现&#xff0c…

解决 ClickHouse 高可用集群中 VRID 冲突问题:基于 chproxy 和 keepalived 的实践分析

Part1背景描述 近期&#xff0c;我们部署了两套 ClickHouse 生产集群&#xff0c;分别位于同城的两个数据中心。这两套集群的数据保持一致&#xff0c;以便在一个数据中心发生故障时&#xff0c;能够迅速切换应用至另一个数据中心的 ClickHouse 实例&#xff0c;确保服务连续性…

推荐FileLink数据跨网摆渡系统 — 安全、高效的数据传输解决方案

在数字化转型的浪潮中&#xff0c;企业对于数据传输的需求日益增加&#xff0c;特别是在不同网络环境之间的文件共享和传输。为了满足这一需求&#xff0c;FileLink数据跨网摆渡系统应运而生&#xff0c;为企业提供了一种安全、高效的数据传输解决方案。 安全第一&#xff0c;保…

力扣排序350题 两个元组的交集2

题目&#xff1a; 给你两个整数数组 nums1 和 nums2 &#xff0c;请你以数组形式返回两 数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个 数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取 较小值&#xff09;。可以不考虑输出…

Python酷库之旅-第三方库Pandas(193)

目录 一、用法精讲 896、pandas.Index.isna方法 896-1、语法 896-2、参数 896-3、功能 896-4、返回值 896-5、说明 896-6、用法 896-6-1、数据准备 896-6-2、代码示例 896-6-3、结果输出 897、pandas.Index.notna方法 897-1、语法 897-2、参数 897-3、功能 897…