蓝桥杯第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; // 输入迷宫地图大小和能力值k
    for (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;
}

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

苍穹外卖项目笔记(6)— Redis操作营业状态设置

1 在 Java 中操作 Redis 1.1 Redis 的 Java 客户端 Jedis&#xff08;官方推荐&#xff0c;且命令语句同 redis 命令&#xff09;Lettuce&#xff08;底层基于 Netty 多线程框架实现&#xff0c;性能高效&#xff09;Spring Data Redis&#xff08;对 Jedis 和 Lettuce 进行了…

解密Long型数据传递:Spring Boot后台如何避免精度丢失问题

前端和后端之间的数据传递至关重要。然而&#xff0c;当涉及到Long类型数据时&#xff0c;可能会出现精度丢失问题&#xff0c;这会影响数据的准确性。本文将为你介绍两种解决方案&#xff0c;帮助你确保Long类型数据在前端和后端之间的精确传递。 精度丢失测试 访问:http://l…

基于微信小程序的爱心捐赠平台的设计与实现-计算机毕业设计源码64923

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c; 小程序的爱心捐赠平台被用户普遍使用&#xff0c;为方便…

【计算机网络笔记】以太网

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

数学建模-基于BL回归模型和决策树模型对早产危险因素的探究和预测

整体求解过程概述(摘要) 近年来&#xff0c;全球早产率总体呈上升趋势&#xff0c;在我国&#xff0c;早产儿以每年 20 万的数目逐年递增&#xff0c;目前早产已经成为重大的公共卫生问题之一。据研究,早产是威胁胎儿及新生儿健康的重要因素&#xff0c;可能会造成死亡或智力体…

面试必须要知道的MySQL知识--索引

10 索引 10.1 数据页存储结构 10.1.1 数据页的各个部分 在讲索引之前&#xff0c;让我们看看一个单独的数据页是什么样子的 去除掉一些我们不太需要那么关注的部分后&#xff0c;简化如下&#xff1a; 也就是说平时我们在一个表里插入的一行一行的数据会存储在数据页里&#…

MySQL企业版之Firewall(SQL防火墙)

​​​1. 关于Firewall插件 2. Firewall插件的工作方式 3. Firewall插件测试 4. 总结延伸阅读 1. 关于Firewall插件 Friewall是MySQL企业版非常不错的功能插件之一,启用Firewall功能后,SQL的执行流程见下图示意: 2. Firewall插件的工作方式 Firewall插件的工作机制大概是…

FL Studio水果软件21.1新版!新增Hyper Chorus插件及自动更新功能

我们很高兴地宣布在去年12月发布重大版本更新后&#xff0c;FL Studio在2023年8月正式更新到21.1版。本次更新虽然只是维护性质&#xff0c;但我们还是为大家带来了一些全新的功能&#xff0c;包括通过钢琴卷中的音阶捕捉和自定义音符工具&#xff0c;引入更快、更有创意的音符…

4/150:寻找两个正序数组的中位数⭐

题目&#xff1a;寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 题解1&#xff1a;暴力 暴力思路简介&#xff0c;…

实测有效的 8 个顶级Android 数据恢复工具

由于我们现在生活在一个依赖数字数据的时代&#xff0c;当重要文件从我们的 Android 手机中消失时&#xff0c;这将是一场数字噩梦。如果您没有预先备份Android手机上的数据或未能通过备份找到已删除的数据&#xff0c;那么选择最好的Android数据恢复软件是最佳选择。 因此&am…

uniapp中进行地图定位

目录 一、创建map 二、data中声明变量 三、获取当前位置信息&#xff0c;进行定位 四、在methods中写移动图标获取地名地址的方法 五、最终展示效果 一、创建map <!-- 地图展示 --><view class"mymap"><!-- <view class"mymap__map"…

大数据存储技术期中考点梳理

1.CAP理论 分布式系统的CAP理论: 首先将分布式系统中的三个特性进行如下归纳: 口(一致性(C):在分布式系统中的所有数据备份&#xff0c;在同一时刻是否有同样的值。(等于所有节点访问同一份最新的数据副本) 口可用性(A):在集群中一部分节点故障后&#xff0c;集群整体是否还能…

再探Java集合系列—ArrayList

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

西南科技大学(数据结构A)期末自测练习二

一、填空题(每空1分,共10分) 1、在线性表的下列运算中,不改变数据元素之间结构关系的运算是( D ) A、插入 B、删除 C、排序 D、定位 2、顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( B ) A.110 B.108 C.100 …

爱普生L3153变ET-2710修复

晚上还在加班&#xff0c;老婆发来消息说打印机故障了&#xff0c;通过网络不能访问 回家一下&#xff0c;三个灯&#xff08;电源&#xff0c;网络&#xff0c;墨水&#xff09;闪烁 重启多次没效果&#xff0c;问客服&#xff0c;说是存储错误&#xff0c;要送售后&#xff…

4.4-Docker bridge0详解

在Docker世界中&#xff0c;两个container是通过bridge0连接起来的。 首先&#xff0c;介绍一个命令&#xff1a;docker network ls 这个docker network ls明令会列举出来当前这台机器上docker有哪些网络。 先看一下bridge。 现在有一个容器flask-hello-docker&#xff0c;它是…

接手了一个外包开发的项目,我感觉我的头快要裂开了~

嗨&#xff0c;大家好&#xff0c;我是飘渺。 最近&#xff0c;我和小伙伴一起接手了一个由外包团队开发的微服务项目&#xff0c;这个项目采用了当前流行的Spring Cloud Alibaba微服务架构&#xff0c;并且是基于一个“大名鼎鼎”的微服务开源脚手架&#xff08;附带着模块代…

IDEA编译器的永久试用设置与基本使用

参考视频&#xff1a; 最通俗易懂的JDK、IDEA的安装使用权威指南 2023新版前端Web开发HTML5CSS3移动web视频教程&#xff0c;前端web入门首选黑马程序员 文章目录 一.安装包下载与安装二.设置IDEA永久试用三.IDEA的基本试用0.IDEA管理Java程序的结构1.工程创建2.模块创建3.包创…

Anolis 安装 Conda 和 YoloV8

Anolis 安装 Conda 和 YoloV8 一 Conda 和 YoloV8 安装1.Conda 下载与安装2.YoloV8 安装 二.测试 一 Conda 和 YoloV8 安装 ## 1. anolis 安装 cv2 依赖库 yum install -y mesa-libGL.x86_64 ## Anaconda https://repo.anaconda.com/archive/ ## 重启终端查看版本 conda --ver…

Linux处理文件常见命令

目录 1 cp 2 rm 3 zip与unzip 3.1 zip 3.2 unzip 4 cd 5 ls 6 chmod 7 scp 7.1 文件在你操作的机器上&#xff0c;你要传给另一个机器 7.1.1 文件 7.1.2 文件夹 7.2 文件在另一个机器上&#xff0c;你要把文件搞到你操作的机器上 7.2.1 文件 7.2.…