迷宫与陷阱(蓝桥杯)

文章目录

  • 迷宫与陷阱
    • 问题描述
    • bfs
      • 解题思路
      • 代码

迷宫与陷阱

问题描述

小明在玩一款迷宫游戏,在游戏中他要控制自己的角色离开一间由 N x N 个格子组成的2D迷宫。

小明的起始位置在左上角,他需要到达右下角的格子才能离开迷宫,每一步,他可以移动到上下左右相邻的格子中。

迷宫中有些格子小明可以经过,我们用 ‘.’ 表示;有些格子是墙壁,小明不能经过,我们用 ‘#’ 表示。

此外,有些格子上有陷阱,我们用 ‘X’ 表示,除非小明处于无敌状态,否则不能经过;有些格子上有无敌道具,我们用 ‘%’ 表示。

当小明第一次到达该格子时,自动获得无敌状态,无敌状态会持续 K 步,之后如果再次到达该格子不会获得无敌状态了。

处于无敌状态时,可以经过有陷阱的格子,但是不会拆除/毁坏陷阱,即陷阱仍会阻止没有无敌状态的角色经过。

给定迷宫,请你计算小明最少经过几步可以离开迷宫?

输入格式
第一行包含两个整数 N 和 K。
以下 N 行包含一个 N x N 的矩阵(矩阵保证左上角和右下角是 ‘.’)。

输出格式
一个整数表示答案。
如果小明不能离开迷宫,输出 -1。

样例输入1

5 3
...XX
##%#.
...#.
.###.
.....

样例输出1

10

数据范围
1 ≤ N ≤ 1000
1 ≤ K ≤ 10

bfs

解题思路

在之前那题迷宫(蓝桥杯)——DFS和BFS的基础上,本题加了很多特殊的情况,逐一判断即可。

注意d标记标记数组表示是否已该能量值到达过该点,并存储到达每个位置的最短步数。

代码

这段代码是用来解决上述迷宫游戏的问题,实现思路是通过广度优先搜索(BFS)算法。下面是代码的详细注释解释:

#include<bits/stdc++.h>
using namespace std;struct node {int x, y, k; // 用于存储当前节点的位置x,y以及剩余无敌步数k
};char g[1010][1010]; // 用于存储迷宫信息
int d[1010][1010][11]; // 用于存储到达每个位置的最短步数,最后一维表示剩余无敌步数
queue<node> q; // BFS使用的队列
int dx[4]={-1,1,0,0}; // x方向移动的四个方向:上、下
int dy[4]={0,0,-1,1}; // y方向移动的四个方向:左、右
int n, k; // n表示迷宫的大小,k表示无敌道具的作用步数// 检查(x,y)位置是否可达,即不是墙壁'#'且在迷宫范围内
bool check(int x,int y) {if(x>=0 && x<n && y>=0 && y<n && g[x][y]!='#')return true;return false;
}// 广度优先搜索函数,返回从起点到终点的最短步数
int bfs() {q.push({0,0,0});d[0][0][0] = 0;while(q.size()) {auto t = q.front(); // 取出队首元素q.pop(); // 弹出队首元素// 如果到达终点,返回到达终点的步数if(t.x==n-1 && t.y==n-1) return d[t.x][t.y][t.k];for(int i=0; i<4; i++) { // 遍历四个方向int x = t.x + dx[i];int y = t.y + dy[i];if(check(x,y)) { // 检查新位置是否可达// 如果是无敌道具'%'且新位置未被访问,更新状态并加入队列if(g[x][y]=='%' && d[x][y][k]==-1) {q.push({x,y,k});d[x][y][k] = d[t.x][t.y][t.k] + 1;}// 如果是陷阱'X',且有无敌状态,且新位置未被访问,更新状态并加入队列if(g[x][y]=='X' && t.k && d[x][y][t.k-1]==-1) {q.push({x,y,t.k-1});d[x][y][t.k-1] = d[t.x][t.y][t.k] + 1;}// 如果是空地'.',且有无敌状态,且新位置未被访问,更新状态并加入队列if(g[x][y]=='.' && t.k && d[x][y][t.k-1]==-1) {q.push({x,y,t.k-1});d[x][y][t.k-1] = d[t.x][t.y][t.k] + 1;}// 如果是空地'.',且没有无敌状态,且新位置未被访问,更新状态并加入队列if(g[x][y]=='.' && t.k==0 && d[x][y][t.k]==-1) {q.push({x,y,t.k});d[x][y][t.k] = d[t.x][t.y][t.k] + 1;}}}}// 如果不能到达终点,返回-1return -1;
}int main() {cin >> n >> k; // 输入迷宫的大小和无敌步数memset(d, -1, sizeof(d)); // 初始化d数组为-1,表示未访问状态// 读入迷宫信息for(int i = 0; i < n; i++)for(int j = 0; j < n; j++)cin >> g[i][j];// 输出从起点到终点的最短步数cout << bfs() << endl;return 0;
}

这段代码通过广度优先搜索(BFS)算法,利用队列来探索从起点(左上角)到终点(右下角)的最短路径,同时处理无敌状态和陷阱,从而找出小明离开迷宫的最短步数。

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

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

相关文章

Mybatis中条件传入多个参数时,如何处理

entity&#xff1a; Data AllArgsConstructor NoArgsConstructor public class User {private Integer id;private String username;private String password;private String phone;private String address; }dao接口&#xff1a; public interface UserDAO {List<User>…

C++ 如何去认识模板

引言: C模板是泛型编程的基石,允许程序员定义可与任何数据类型协作的函数和类。这种机制极大地增加了代码的灵活性和复用性,是C最强大的特性之一。本文将深入探讨C模板的概念、优势以及使用方法,帮助读者掌握这一重要的编程工具。 文章目录 模板简介模板的优势一、模板基础1.1…

基于vue+element+springboot+uniapp开发的智慧城管源码,java智慧城市管理综合执法系统源码

智慧城管源码&#xff0c;智慧执法&#xff0c;数字化城市管理综合执法系统源码 智慧城管系统充分利用物联网、云计算、信息融合、网络通讯、数据分析与挖掘等技术&#xff0c;对城市管理进行全方位覆盖。它通过建立城市综合管理平台&#xff0c;将城市的信息和管理资源有机结合…

Qt_day5:2024/3/26

作业&#xff1a;实现闹钟 代码&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //定时器事件 #include <QTime> //时间类 #include <QtTextToSpeech> //文本转语音类 #include <…

hgvs中的[数字]是什么意思

hgvs中的[数字],例如NM_144670.6(A2ML1):c.462+9GGA[5]中的[5]详细解释: Repeated Sequences# Repeated sequence: a sequence where, compared to a reference sequence, a segment of one or more nucleotides (the repeat unit) is present several times, one after the…

错误 LNK1104 无法打开文件“mfc140.lib”

如图&#xff0c;编译一个别人已有的项目&#xff0c;我的编译报错为&#xff1a; 但是我所有文件夹全局搜索了一下&#xff0c;这个文件是存在的。但是当前项目访问不到。 更改方法&#xff1a;项目->属性->配置属性->VC目录->库目录 全局搜索找到mfc140.lib的…

【LeetCode 算法专题突破】定长滑动窗口

文章目录 前言[1456. 定长子串中元音的最大数目](https://leetcode.cn/problems/maximum-number-of-vowels-in-a-substring-of-given-length/)题目描述&#xff1a;难度分1263代码与解题思路代码复盘 [2269. 找到一个数字的 K 美丽值](https://leetcode.cn/problems/find-the-k…

如何在pycharm中使用anaconda的虚拟环境

https://blog.csdn.net/weixin_43486940/article/details/123229290

MySQL: 数据类型

数值类型 整型类型 TINYINT&#xff1a;8位SMALLINT&#xff1a;16位MEDIUMINT&#xff1a;24位INT 或 INTEGER&#xff1a;32位BIGINT: 64位 浮点类型 FLOAT&#xff1a;单精度浮点数DOUBLE 或 REAL&#xff1a;双精度浮点数 字符串类型 定长字符串类型 CHAR(size)&…

NAT---网络地址转换技术

Network Address Translation 1、起源&#xff1a;ip地址不够用 2、作用&#xff1a;让私网地址映射成公网地址&#xff0c;进而访问网络。 3、私网Ip地址的范围&#xff1a; A类&#xff1a;10.0.0.0-10.255.255.255 B类&#xff1a;172.16.0.0-172.31.255.255 C类&…

10本程序员必看的书籍

以下是10本程序员必看的书籍推荐&#xff1a; **1.《代码大全》&#xff1a;**史蒂夫迈克康奈尔著。这本书是编程最佳实践指南之一&#xff0c;它详细讲解了如何编写整洁、高效的代码&#xff0c;对于提升编程技能和代码质量有很大帮助。 **2.《深入理解计算机系统》&#xff1…

码垛机与人工搬运:效率与安全性的比较分析

在现代包装行业中&#xff0c;泡沫箱因其轻便和保温特性被广泛用于商品的包装与运输。随着自动化技术的不断发展&#xff0c;码垛机成为提升泡沫箱生产效率、降低劳动强度的关键技术。本文旨在比较码垛机与人工码垛在泡沫箱生产中的优势&#xff0c;并探讨自动化码垛的未来发展…

代码随想录算法训练营DAY3| C++链表Part.1|LeetCode:203.移除链表元素、707.设计链表、206.反转链表

文章目录 203.移除链表元素直接操作原链表虚拟头结点 707.设计链表定义链表结构体MyLinkedList() 初始化 MyLinkedList 对象。int get(int index)void addAtHead(int val)void addAtTail(int val)void addAtIndex(int index, int val)void deleteAtIndex(int index)void printL…

Python程序设计 模块和包

1. 模块和包 1.1 模块&#xff1a; 一个 py 文件&#xff0c;就是一个模块&#xff0c;文件中包括定义的函数和类等信息。 尽管可以 import 多次&#xff0c;实际上模块只导入一次 模块搜索路径内存中已经加载的模块 -> 内置模块 -> sys.path路径&#xff08;导模块的…

Springboot快速整合bootstrap-table使用,接口对接

这个表格加持还是不错了&#xff0c;自带了全局搜索&#xff0c;分页&#xff0c;数据导出&#xff0c;卡片视图&#xff0c;等&#xff0c;本次整合添加了数据添加弹窗和编辑数据回显弹窗&#xff0c;附完整页面代码&#xff0c;只需要拿过来替换自己实际的接口即可。 效果图 …

鸿蒙实战开发-如何通过拖动滑块调节应用内字体大小

介绍 本篇Codelab将介绍如何使用基础组件Slider&#xff0c;通过拖动滑块调节应用内字体大小。要求完成以下功能&#xff1a; 实现两个页面的UX&#xff1a;主页面和字体大小调节页面。拖动滑块改变字体大小系数&#xff0c;列表页和调节页面字体大小同步变化。往右拖动滑块字…

ppp验证实验

实际操作图 1&#xff0c;IP划分分配 [r1]interface Serial 4/0/0 [r1-Serial4/0/0]ip add 192.168.1.1 24 [r2]interface Serial 4/0/0 [r2-Serial4/0/0]ip address 192.168.1.2 24 [r2]int Mp-group 0/0/0 [r2-Mp-group0/0/0]ip add 192.168.2.1 24 [r3]int Mp-group 0/…

Xcode Launching “XXX“ is taking longer than expected

文章目录 1.问题2.如何进入iOS DeviceSupport目录3.解决方法4.参考博客 1.问题 LLDB is likely reading from device memory to resolve symbols 2.如何进入iOS DeviceSupport目录 3.解决方法 进入iOS DeviceSupport目录&#xff0c;删除该真机对应的架构文件&#xff08;比如…

QT作业day3

1、使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是…

JMeter 如何并发执行 Python 脚本

要在JMeter中并发执行Python脚本&#xff0c;可以使用Jython脚本或通过调用外部Python脚本的方式实现。 使用Jython脚本并发执行Python脚本的步骤&#xff1a; 1、创建一个线程组&#xff1a;在JMeter界面中&#xff0c;右键点击测试计划&#xff0c;选择 “添加” -> “线…