蓝桥杯第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数据…

计算机网络实用工具之masscan

简介 MASSCAN 是 TCP 端口扫描器&#xff0c;它异步传输 SYN 数据包并生成类似于最著名的端口扫描器 nmap 的结果。在内部&#xff0c;它的操作更像是scanrand、unicornscan和ZMap&#xff0c;采用异步传输。它是一个灵活的实用程序&#xff0c;允许任意地址和端口范围 官网 …

openssl+EVP详解

EVP&#xff08;Enveloped Public Key&#xff09;是 OpenSSL 中用于提供对称加密、非对称加密和哈希功能的高级加密接口。EVP 库提供了一个抽象的加密框架&#xff0c;使得可以在不同的算法实现之间进行切换&#xff0c;而不需要改变应用程序的代码。以下是一些 EVP 开发的主要…

揭秘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 动态规划基础篇例题 这一篇的例题解答是严格按照我上一篇写的动态规划三部曲做的&…

AI 发展的三次危机

前几天闹得沸沸扬扬的OpenAI宫斗事件终于落下帷幕&#xff0c;事情以奥特曼回归OpenAI继续担当CEO并且重组董事会结局。 看起来还算一个不错的结果。 OpenAI 作为目前全球大模型的领先者和佼佼者&#xff0c;他的一举一动肯定会影响整个人类 AI 的发展历程&#xff0c;这次宫…

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 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文…

未来的大模型发展又会走向哪一边

近期&#xff0c;特斯拉CEO马斯克公开表示&#xff1a;OpenAI不该闭源&#xff0c;自家首款聊天机器人将开源。在数字化时代&#xff0c;开源与闭源软件的辩论一直是技术界的热门话题。开源是否能够带来更好的创新与合作&#xff1f;闭源是否能够保护商业利益与技术安全&#x…

力扣141-环形链表

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

重新认识电声器件!

电声器件&#xff1a;实现电声转换的重要工具 在科技快速发展的今天&#xff0c;电声器件已经深入到我们生活的方方面面。无论是音乐、语音通信、电影等娱乐领域&#xff0c;还是雷达、电子侦察等军事领域&#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的默认初始容量…

Makefile之 CFLAGS CXXFLAGS CC LDFLAGS LD

Makefile之 CFLAGS CXXFLAGS CC LDFLAGS LD 1&#xff09;CFLAGS&#xff1a;该环境变量用于指定C语言的编译器选项。它包含了编译C源代码时所需的选项&#xff0c;例如优化级别、警告级别、编译器标志等。在Makefile中&#xff0c;可以将CFLAGS设置为任何所需的编译器选项。例…

BSD socket API

API函数 以下函数是最基本的 socket API socket() 创造某种类型的套接字&#xff0c;分配一些系统资源&#xff0c;用返回的整数识别。 bind() 一般是用在服务器这边&#xff0c;和一个套接字地址结构相连&#xff0c;比如说是一个特定的本地端口号和一个IP地址。 listen()用在…

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

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

SpringBoot : ch11 整合RabbitMQ

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

基于SpringBoot的教师工作量管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的教师工作量管理系统,ja…