蓝桥杯第229题 迷宫与陷阱 BFS C++ 模拟 带你理解迷宫的深奥

题目

迷宫与陷阱 - 蓝桥云课 (lanqiao.cn)icon-default.png?t=N7T8https://www.lanqiao.cn/problems/229/learning/?page=1&first_category_id=1&name=%E8%BF%B7%E5%AE%AB%E4%B8%8E%E9%99%B7%E9%98%B1

思路和解题方法

  1. 首先,定义了一个结构体node来表示迷宫中的每个节点,包括节点的坐标(x, y)、已经走过的步数cnt和当前状态status(即无敌时间还剩余多少步)。同时,定义了一个二维数组a来表示迷宫的地图,一个二维数组vis来标记节点是否被走过,一个二维数组s来保存节点的状态。
  2. 接下来,通过输入获取迷宫的大小n和能力值k。然后,使用嵌套循环读取每个节点的状态,并将其保存在地图数组a中。
  3. 之后,定义了方向数组nexney,分别表示在x方向和y方向上的移动。然后,创建一个队列que,用于存储待遍历的节点。
  4. 接下来,将起点(1, 1)添加到队列中,并标记起点已经走过。然后开始一个循环,直到队列为空为止。在每次循环中,取出队列的第一个节点temp,并将其弹出队列。
  5. 然后,对四个方向进行遍历,计算下一个节点的坐标(x, y)。通过调用check()函数来检查下一个节点是否能够到达。如果可以到达,则更新状态,并将下一个节点加入队列。
  6. 如果下一个节点是道具格(用%表示),则更新状态为无敌状态,并将状态保存到状态数组s中。然后标记该节点已经走过,并将其加入队列。
  7. 如果下一个节点之前已经走过,并且当时的无敌状态比现在的状态更好,则不需要再走一次。否则,将下一个节点加入队列。
  8. 最后,当到达终点时,返回最短路径的步数。
  9. 整个算法的思路是通过广度优先搜索遍历迷宫中的所有可达节点,并记录到达每个节点时的步数和状态。通过不断更新状态和比较最优状态,找到从起点到终点的最短路径。

复杂度

        时间复杂度:

                O(n^2*k)

时间复杂度为O(n^2*k),其中n为迷宫大小,k为能力值。原因是最坏情况下需要遍历所有的节点,并且每个节点可能对应k种不同的状态。

        空间复杂度

                O(n^2*k)

空间复杂度也为O(n^2*k),原因是需要存储地图数组a、标记数组vis和状态数组s,以及队列que中的节点信息。需要注意的是,这里的空间复杂度是个常数倍,具体大小取决于迷宫的大小和能力值的范围。

c++ 代码

#include<iostream>
#include<queue>
using namespace std;const int N = 1010;struct node
{int x, y; // 节点的坐标int cnt; // 节点已经走过的步数int status; // 当前的状态,即无敌时间还剩余多少步
};int a[N][N] = { 0 }, vis[N][N] = { 0 }, s[N][N] = { 0 }; // 地图a、标记数组vis、状态数组s
int n, k; // 地图大小n和能力值k
int nex[4] = { 1,0,-1,0 }; // 方向数组,表示x方向的移动
int ney[4] = { 0,1,0,-1 }; // 方向数组,表示y方向的移动// 检查下一个节点是否能够到达
bool check(int x, int y, int st)
{if (x > n || y > n || x < 1 || y < 1 || a[x][y] == '#') return false; // 出界或者撞墙if (st == 0 && a[x][y] == 'X') return false; // 非无敌撞陷阱return true;
}int bfs()
{queue<node> que; // 存储待遍历的节点que.push(node{ 1,1,0,0 }); // 起点vis[1][1] = 1; // 标记起点被走过while (!que.empty()) // 当队列不为空时进行循环{node temp = que.front(); // 取出队列的第一个节点que.pop(); // 将队列的第一个节点弹出if (temp.x == n && temp.y == n) return temp.cnt; // 如果到达终点,返回最短路径的步数for (int i = 0; i < 4; i++) // 在四个方向上进行遍历{int x = temp.x + nex[i], y = temp.y + ney[i]; // 计算下一个节点的坐标if (check(x, y, temp.status)) // 如果可以走{int status1 = 0 > temp.status - 1 ? 0 : temp.status - 1; // 更新状态,此时的状态是x,y时的int status2 = max(temp.status - 1, 0);int status = status1;if (a[x][y] == '%') // 如果是道具格{status = k; // 更新状态为无敌状态s[x][y] = status; // 将状态保存到状态数组中a[x][y] = 0; // 走过道具格之后就变成普通格子vis[x][y] = 1; // 标记走过que.push(node{ x,y,temp.cnt + 1,status }); // 将下一个节点加入队列}else {if (!vis[x][y]) // 如果没有走过,有必要走一次{vis[x][y] = 1; // 标记走过s[x][y] = status;que.push(node{ x,y,temp.cnt + 1,status }); // 将下一个节点加入队列}if (status <= s[x][y]) // 之前走过,并且当时的无敌状态更好continue;else {que.push(node{ x,y,temp.cnt + 1,status }); // 否则,如果之前走过但是无敌状态没有再一次走的时候好,有必要再走一次}}}}}
}int main()
{cin >> n >> k; // 输入迷宫地图大小和能力值kfor (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++){char c;cin >> c;a[i][j] = c; // 输入每个节点的状态}cout << bfs() << endl; // 输出最短路径的步数return 0;
}

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

3种在ArcGIS Pro中制作山体阴影的方法

山体阴影可以更直观的展现地貌特点&#xff0c;表达真实的地形&#xff0c;这里为大家介绍一下在ArcGIS Pro中制作山体阴影的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&#xff0c;常见的GIS数据…

揭秘Git高手的10个秘密武器:让你的工作效率飙升!

Git和GitHub是每个软件工程师都必须了解的最基本的工具。它们是开发人员日常工作不可或缺的一部分&#xff0c;每天都要与之互动。 精通Git不仅能简化你的日常操作&#xff0c;还能显著提高生产力。在这篇文章中&#xff0c;我们将探讨一组能够极大提升生产力的命令。 随着对…

适用于 Windows 的最佳电脑数据恢复软件是什么?

数据丢失是数字世界中令人不快的一部分&#xff0c;它会在某一时刻影响许多计算机用户。很容易意外删除一些重要文件&#xff0c;这可能会在您努力恢复它们时带来不必要的压力。幸运的是&#xff0c;数据恢复软件可以帮助恢复已删除的文件&#xff0c;即使您没有备份它们。这是…

智慧公厕为高速服务区公厕做出的贡献

在现代社会&#xff0c;科技的飞速发展改变了人们的生活方式&#xff0c;也深刻影响着城市的基础设施和公共服务。而在这个数字化时代的背景下&#xff0c;智慧公厕作为城市智能化管理的一部分&#xff0c;为高速服务区公厕带来了一系列的创新和贡献&#xff0c;为旅客的出行提…

动态规划经典例题leetcode思路代码详解

目录 动态规划基础篇例题 leetcode70题.爬楼梯 leetcode746题.使用最小花费爬楼梯 leetcode198题.打家劫舍 leetcode62题.不同路径 leetcode64题.最小路径和 leetcode63题.63不同路径II 动态规划基础篇例题 这一篇的例题解答是严格按照我上一篇写的动态规划三部曲做的&…

P9242 [蓝桥杯 2023 省 B] 接龙数列(dp+最长接龙序列+分类)

1. 计算0~9为结尾的最长子串长度 2. 对于每个数字&#xff0c;比较其开头可连接子串长度1 与 原来以其末位为末尾的子串长度 3. 更新以其末位为末尾的子串长度 #include<iostream> #include<string.h>using namespace std;// 相当于记录…

万户协同办公平台ezoffice SendFileCheckTemplateEdit.jsp接口存在SQL注入漏洞 附POC

@[toc] 万户协同办公平台ezoffice SendFileCheckTemplateEdit.jsp接口存在SQL注入漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文…

力扣141-环形链表

文章目录 力扣141-环形链表示例代码实现要点剖析 力扣141-环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测…

计算机基础知识60

MySQL分组 # 概念&#xff1a;分组是按照某个指定的条件将单个单个的个体分成一个个整体 # MySQL分组的关键字&#xff1a;group by # 分组一般配合聚合函数使用&#xff1a; sum max min avg count 基本的语法格式: group by 字段名 [having 条件表达式] # 单独使用 group by关…

再探Java集合系列—ArrayList

适用于什么场景&#xff1f; 检索比较多的场景&#xff0c;例如学生成绩管理系统&#xff0c;老师对学生的成绩进行排名或查询操作 ArrayList有哪些特点&#xff1f; 1、ArrayList集合底层采用了数组数据结构&#xff0c;是Object类型 2、动态数组。ArrayList的默认初始容量…

第1章 理解知识图谱(一)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

SpringBoot : ch11 整合RabbitMQ

前言 在当今的互联网时代&#xff0c;消息队列成为了构建高可靠、高性能系统的重要组件之一。RabbitMQ作为一个可靠、灵活的消息中间件&#xff0c;被广泛应用于各种分布式系统中。 本篇博客将介绍如何使用Spring Boot整合RabbitMQ&#xff0c;实现消息的发送和接收。通过这种…

视频集中存储/磁盘阵列EasyCVR平台黑名单异常解决步骤是什么?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

华为云(HECS)docker环境下安装jenkins

Jenkins是一个开源的自动化工具&#xff0c;可以自动化地完成构建、测试、交付或部署等任务。总之重点就是三个字&#xff1a;自动化&#xff0c;至于如何实现这些功能&#xff0c;Jenkins基于插件化的机制&#xff0c;提供了众多的插件来完成持续集成CI与持续部署CD。 【持续…

【Python】python天气数据抓取与数据分析(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

pdf文件能扫码查看吗?一键做文本二维码

pdf格式是常用的一种文件格式&#xff0c;很多资料、展示性的内容都会选择这种格式&#xff0c;现在很多人都需要将文件生成二维码图片后分享给他人&#xff0c;那么文件存入二维码展示的方法有哪些呢&#xff1f;下面给大家分享一招使用二维码生成器来生成二维码图片的操作方法…

[英语学习][3][Word Power Made Easy]的精读与翻译优化

[序言] 这次翻译校验, 难度有点大, 原版中英翻译已出现了严重地偏差. 昨晚11点开始阅读如下段落, 花费了1个小时也没有理解原作者的核心表达, 索性睡觉了. 今早学习完朗文单词之后, 9点半开始继续揣摩. 竟然弄到了中午11点30, 终于明白原作者要表达的意思了. 废话不多说&#x…

SVD recommendation systems

SVD recommendation systems 为什么在推荐系统中使用SVD 一个好的推荐系统一定有小的RMSE R M S E 1 m ∑ i 1 m ( Y i − f ( x i ) 2 RMSE \sqrt{\frac{1}{m} \sum_{i1}^m(Y_i-f(x_i)^2} RMSEm1​i1∑m​(Yi​−f(xi​)2 ​ 希望模型能够在已知的ratings上有好的结果的…

[学习笔记]IK分词器的学习

IK分词器有几种模式 # 测试分词器 POST /_analyze {"text":"黑马程序员学习java太棒了","analyzer": "standard" }# 测试分词器 POST /_analyze {"text":"黑马程序员学习java太棒了","analyzer": &quo…

怎么更新BI报表数据?问我就对了

BI大数据分析工具上有大量的BI报表模板&#xff0c;这些模板都是一个个完整的BI报表&#xff0c;只需将数据源更换&#xff0c;立即就能用来分析我们自己的数据。那&#xff0c;BI报表的数据怎么更新&#xff1f;接下来就来说说这事。 目的&#xff1a;更新BI报表数据 工具&a…