地牢大师问题(bfs提高训练 + 免去边界处理的特殊方法)

地牢大师问题

文章目录

  • 地牢大师问题
    • 前言
    • 题目描述
    • 题目分析
      • 输入处理
      • 移动方式【和二维的对比】
      • 边界判断问题的解决
    • 代码
    • 总结

前言

在之前的博客里面,我们介绍了bfs 基础算法的模版和应用,这里我们再挑战一下自己,尝试一个更高水平的题目,加深一下对bfs算法的理解。如果对bfs更多知识感兴趣的话,可以点个关注,后续会继续更新有关知识点的。
往期的文章如下:
红与黑问题(bfs+dfs 解法)

题目描述

你现在被困在一个三维地牢中,需要找到最快脱离的出路!

地牢由若干个单位立方体组成,其中部分不含岩石障碍可以直接通过,部分包含岩石障碍无法通过。

向北,向南,向东,向西,向上或向下移动一个单元距离均需要一分钟。

你不能沿对角线移动,迷宫边界都是坚硬的岩石,你不能走出边界范围。

请问,你有可能逃脱吗?
如果可以,需要多长时间?

输入格式
输入包含多组测试数据。

每组数据第一行包含三个整数 L,R,C
分别表示地牢层数,以及每一层地牢的行数和列数。

接下来是 L 个 R 行 C 列的字符矩阵,用来表示每一层地牢的具体状况。

每个字符用来描述一个地牢单元的具体状况。

其中, 充满岩石障碍的单元格用”#”表示,不含障碍的空单元格用”.”表示,你的起始位置用”S”表示,终点用”E”表示。

每一个字符矩阵后面都会包含一个空行。

当输入一行为”0 0 0”时,表示输入终止。

输出格式
每组数据输出一个结果,每个结果占一行。

如果能够逃脱地牢,则输出”Escaped in x minute(s).”,其中X为逃脱所需最短时间。

如果不能逃脱地牢,则输出”Trapped!”。

数据范围
1≤L,R,C≤100
输入样例:

3 4 5
S....
.###.
.##..
###.######
#####
##.##
##...#####
#####
#.###
####E1 3 3
S##
#E#
###0 0 0

输出样例:

Escaped in 11 minute(s).
Trapped!

题目分析

输入处理

可能有的小伙伴是 按照z , x , y 的顺序输入的,其实大可不必,这里的z , x , y
是对称的,也就是说我们对于 z , x , y 三个方向都没有特定的要求,可以随意选取,那么我们只要照常输入就行,相当于交换了坐标系

移动方式【和二维的对比】

看图:在算法坐标系中,二维一般是这样的
在这里插入图片描述
3维看图:
在这里插入图片描述
因为每次移动一个长度单位,所以我们在这里是以1为计量单位表示方向。

边界判断问题的解决

接触过bfs算法题目的小伙伴肯定会对边界判断感到不耐烦,这里教大家一个方法摆脱边界判断:
首先将整个地图全部设成#障碍状态,这样后面就不会走到外面去【关键步骤】

memset(g,'#',sizeof g);

其次输入的时候从 1 开始,这里可以避免边界问题,假设我们的输入从 0 开始,那么就会出现 -1 的意外状况

for(int i=1;i<=l;i++){for(int j=1;j<=r;j++){for(int k=1;k<=c;k++){cin>>g[i][j][k];if(g[i][j][k]=='S'){sx=i,sy=j,sz=k;}if(g[i][j][k]=='E'){ex=i,ey=j,ez=k;}}}}

最后,封死所有走过的路
假设我们不封堵,我们能够走回走过的点,就说明一定有个环,这就无解了,其次,
封过走过的路之后吗,得到的一定就是最小值
一般bfs的处理方法会用一个s t [N]的数组记录是否走过,这里相当于将我们的地图数组一箭双雕

代码

解释都在代码注释当中啦

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N = 107;char g[N][N][N];//用于存储地图数据
int d[N][N][N];//用于记录步数
int dx[6]={1,0,-1,0,0,0};
int dy[6]={0,1,0,-1,0,0};
int dz[6]={0,0,0,0,1,-1};
int l,r,c;
struct node{int x,y,z;//这里需要对bfs引入 3 哥数据,也就是遍历的队列要包含 3 哥元素//所以我们用结构体存储
};
int bfs(int sx,int sy,int sz){g[sx][sy][sz]='#';*//将走过的路封死d[sx][sy][sz]=0;//将开始的起点举例设为 0 queue<node> q;q.push({sx,sy,sz});while(!q.empty()){auto t=q.front();q.pop();for(int i=0;i<6;i++){// cout<<dx[i]<<' '<<dy[i]<<' '<<dz[i]<<endl;int a=t.x+dx[i];int b=t.y+dy[i];int c=t.z+dz[i];// cout<<a<<b<<c<<endl;// cout<<a<<' '<<b<<' '<<c<<endl;if(g[a][b][c]!='#'){//直接判断是否为障碍就行//不需要俺么劳心费神的操作// cout<<g[a][b][c]<<endl;if(g[a][b][c]=='.'){q.push({a,b,c});g[a][b][c]='#';d[a][b][c]=d[t.x][t.y][t.z]+1;// cout<<a<<' '<<b<<' '<<c<<endl;// puts("");}if(g[a][b][c]=='E'){return d[t.x][t.y][t.z]+1;}}}}return -1;
}
int main(){while(cin>>l>>r>>c,l||r||c){memset(g,'#',sizeof g);//由于要输入多个数据memset(d,-1,sizeof d);//每次要将数据清零int sx,sy,sz;int ex,ey,ez;for(int i=1;i<=l;i++){for(int j=1;j<=r;j++){for(int k=1;k<=c;k++){cin>>g[i][j][k];if(g[i][j][k]=='S'){sx=i,sy=j,sz=k;//找到最开始的点}if(g[i][j][k]=='E'){ex=i,ey=j,ez=k;//找到结束的点,后来发现这步操作没有用}}}}int t=bfs(sx,sy,sz);if(t==-1) printf("Trapped!");else printf("Escaped in %d minute(s).",t);puts("");}return 0;
}

总结

以上就是地牢大师的解法,喜欢的小伙伴可以点个赞啦
记住免去边界处理的关键在于将整个地图数组障碍化,起始的输入也是从 1 开始,最大程度上面减小边界处理步骤。

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

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

相关文章

手撕 LFU 缓存

大家好&#xff0c;我是 方圆。LFU 的缩写是 Least Frequently Used&#xff0c;简单理解则是将使用最少的元素移除&#xff0c;如果存在多个使用次数最小的元素&#xff0c;那么则需要移除最近不被使用的元素。LFU 缓存在 LeetCode 上是一道困难的题目&#xff0c;实现起来并不…

C语言指针笔试题讲解

大家好&#xff0c;我们来学习一些C语言的指针笔试题。对于C语言指针的模块想必大家都非常的头疼吧&#xff0c;那么我们就来就来看看一些关于C语言指针的笔试题。 首先让我们看到我们今天的第一题。 int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(&a 1)…

AI AIgents时代-(四.)应用上手

HuggingGPT & MetaGPT . &#x1f7e2; HuggingGPT HuggingGPT是一个多模型调用的 Agent 框架&#xff0c;利用 ChatGPT 作为任务规划器&#xff0c;根据每个模型的描述来选择 HuggingFace 平台上可用的模型&#xff0c;最后根据模型的执行结果生成总结性的响应。 这个项…

Cesium 地球(2)-瓦片创建

Cesium 地球(2)-瓦片创建 QuadtreePrimitive代码执行4个步骤: step1: update()step2: beginFrame()step3: render()step4: endFrame() 但并不是瓦片的创建步骤。 1、创建 QuadtreeTile 基于 step3: render() step3: render()┖ selectTilesForRendering()在 selectTilesFo…

循环神经网络-简洁实现

参考&#xff1a; https://zh-v2.d2l.ai/chapter_recurrent-neural-networks/rnn-concise.html https://pytorch.org/docs/stable/generated/torch.nn.RNN.html?highlightrnn#torch.nn.RNN RNN import torch from torch import nn from torch.nn import functional as F from…

排序算法:归并排序(递归和非递归)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关排序算法的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

什么是ELK

什么是ELK ELK 并不是一个技术框架的名称&#xff0c;它其实是一个三位一体的技术名词&#xff0c;ELK 的每个字母都来自一个技术组件&#xff0c;分别是 Elasticsearch&#xff08;简称 ES&#xff09;、Logstash 和 Kibana。 三个技术组件是独立的&#xff0c;后两个被elast…

table 写表格

<!-- colspan"3" 合并3列 --> <!-- rowspan"4" 合并4行 --> <!-- 7行4列 --><table><tr><th>企业名称</th><td>2020.11.11</td><th>法定代表人</th><td>2020.11.11</td>&l…

Nginx替代产品-Tengine健康检测

1、官网地址 官网地址&#xff1a;The Tengine Web Server 文档地址&#xff1a;文档 - The Tengine Web Server 健康检测模块&#xff1a;ngx_http_upstream_check_module - The Tengine Web Server 2、安装 下载 wget https://tengine.taobao.org/download/tengine-3.…

如何使用ArcGIS Pro提取河网水系

DEM数据除了可以看三维地图和生成等高线之外&#xff0c;还可以用于水文分析&#xff0c;这里给大家介绍一下如何使用ArcGIS Pro通过水文分析提取河网水系&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&a…

PASCAL VOC2012数据集详细介绍

PASCAL VOC2012数据集详细介绍 0、数据集介绍2、Pascal VOC数据集目标类别3、 数据集下载与目录结构4、目标检测任务5、语义分割任务6、实例分割任务7、类别索引与名称对应关系 0、数据集介绍 2、Pascal VOC数据集目标类别 在Pascal VOC数据集中主要包含20个目标类别&#xff…

初见QT,控件的基本应用,实现简单登录窗口

窗口实现代码 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//窗口设置this->setFixedSize(538, 373); //固定窗口大小this->setWindowIcon(QIcon("G:\\QT_Icon\\windos_icon2.png"))…

线性代数基础-行列式

一、行列式之前的概念 1.全排列&#xff1a; 把n个不同的元素排成一列&#xff0c;称为n个元素的全排列&#xff0c;简称排列 &#xff08;实际上就是我们所说的排列组合&#xff0c;符号是A&#xff0c;arrange&#xff09; 2.标准序列&#xff1a; 前一项均小于后一项的序列…

微博情绪分类

引自&#xff1a;https://blog.csdn.net/no1xiaoqianqian/article/details/130593783 友好借鉴&#xff0c;总体抄袭。 所需要的文件如下&#xff1a;https://download.csdn.net/download/m0_37567738/88340795 import os import torch import torch.nn as nn import numpy a…

32:TX Text Control ActiveX/ASP.NET/WinForms/WPF Crack

TX Text Control ActiveX 32.0 添加操作“普通”样式表的能力。 2023 年 9 月 14 日 - 15:38新版本 特征 脚注- 在文档中插入与 Microsoft Word 兼容的脚注。脚注是一种文字处理功能&#xff0c;允许用户在页面底部插入附加信息。 可编辑的[普通]样式表- 添加了操作[普通]样式的…

9.20号作业实现钟表

1.widget.h #include <QPainter> //画家 #include <QTimerEvent> #include <QTime> #include<QTimer> //定时器类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Wid…

物联网网络安全:保护物理世界和数字世界的融合

我们正在见证数字技术如何成为我们日常生活和经济系统的一部分&#xff0c;从而提高福利并增强竞争力。尽管如此&#xff0c;新的尖端互联技术的迅速出现和采用也对政府、企业和整个社会构成了重大威胁。 长期以来&#xff0c;网络安全威胁一直是电影行业的一个现成的灵感来源&…

el-table表格中加入输入框

<template><div class"box"><div class"btn"><el-button type"primary">发送评委</el-button><el-button type"primary" click"flag true" v-if"!flag">编辑</el-button…

RFID技术在仓储物流供应链管理中的应用

仓储物流供应链管理的透明度和库存周转率成为管控的重点&#xff0c;为了提高仓储物流的效率和减少库存损失&#xff0c;RFID技术被广泛应用于仓储、分发、零售管理等各个环节&#xff0c;为供应链管理带来了巨大的改变和提升。 首先&#xff0c;采用RFID技术进行仓库物流智能化…

Jenkins “Trigger/call builds on other project“用法及携带参数

1.功能 “Trigger/call builds on other project” 功能是 Jenkins 中的一个特性&#xff0c;允许您在某个项目的构建过程中触发或调用另一个项目的构建。 当您在 Jenkins 中启用了 “Trigger/call builds on other project” 功能并配置了相应的触发条件后&#xff0c;当主项…