Week12 作业 B - 必做题(三维空间迷宫)

2023-05-16

一、题目描述

zjm被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成。
zjm每次向上下前后左右移动一个单位需要一分钟,且zjm不能对角线移动。
空间的四周封闭。zjm的目标是走到空间的出口。
是否存在逃出生天的可能性?如果存在,则需要多少时间?

Input

输入第一行是一个数表示空间的数量。
每个空间的描述的第一行为L,R和C(皆不超过30)。
L表示空间的高度,R和C分别表示每层空间的行与列的大小。
随后L层,每层R行,每行C个字符。
每个字符表示空间的一个单元。’#‘表示不可通过单元,’.‘表示空白单元。
zjm的起始位置在’S’,出口为’E’。每层空间后都有一个空行。
L,R和C均为0时输入结束。

Output

每个空间对应一行输出。
如果可以逃生,则输出如下
Escaped in x minute(s).
x为最短脱离时间。
如果无法逃生,则输出如下
Trapped!

Sample Input

3 4 5
S….
.###.
.##..
###.#

#####
#####
##.##
##…

#####
#####
#.###
####E

1 3 3
S##
#E#
###

0 0 0

Sample Outpu

Escaped in 11 minute(s).
Trapped!

二、思路概述

  • 用一个三维数组记录迷宫信息,包括哪个位置是起点,哪个是终点,哪个位置不可以走,哪个位置可以通过。
  • 从起点开始,进行bfs探索,遇到可以通过的位置以及它并未被走过,就压入队列,以便下一次探索,直到走到了终点的位置或者队列空(无法走到终点的位置),结束探索。
  • 在point结构体中加一个level,用来表示层数,也就是走到某个位置走了几分钟。

三、细节

  1. 使用了队列queue,而且是多组输入输出,却没有考虑到队列要清零。
  2. 三维空间,判断坐标是否越界,明明数组是0-n-1(共n个数字),但是判断条件却写的是>n才越界,这个应该是属于,到底数组从0开始存储,还是从1开始的问题。
  3. int dx[]={0,0,0,0,1,-1};
    int dy[]={0,0,1,-1,0,0};
    int dz[]={1,-1,0,0,0,0};
    使用这样的标记数组,往各个方向探索,我写的x=x+dx[i],应该是int xx=x+dx[i],不然的话,就是x这个点一直变化,非常诡异。

四、完整代码

/*可使用bfs的方法,从起点开始向上下左右四个方向探索,
如果可走,就进去,直到碰壁,或者不能走,直到走到终点*/

//可通过的块置0,不能的置1,起点置10,终点置100 
#include<iostream>
#include<algorithm> //fill函数,sort函数,max函数 
#include<set>//set函数,(去除重复) 
#include<map>//不同类型转换 
#include<cstring>//memset函数 
#include<queue>
using namespace std;

struct point{
	int x,y,z;
	//bool is;
	int level;
	point(){}
	
    point(int xx,int yy,int zz,int le)
    {
   	    x=xx;
   	    y=yy;
   	    z=zz;
   	    level=le;
   	    
    }
    
};

int l,r,c;
int kj[30][30][30];//三维数组,存储迷宫 
int vis[30][30][30];//标记是否到达过 
queue<point> xp;

int dx[]={0,0,0,0,1,-1};
int dy[]={0,0,1,-1,0,0};
int dz[]={1,-1,0,0,0,0};

void bfs(int xx,int yy,int zz){
	
	for(int i=0;i<30;i++){
		for(int j=0;j<30;j++){
			for(int k=0;k<30;k++){
				vis[i][j][k]=0;
			}
		}
	}
	
	point p(xx,yy,zz,0);
	//p.is=true;
	vis[xx][yy][zz]=1; 
	xp.push(p);
	
	while(!xp.empty() ){
		
		point pp=xp.front() ;xp.pop() ;
	
		int px=pp.x;int py=pp.y;int pz=pp.z;int level=pp.level;
		//cout<<px<<" "<<py<<" "<<pz<<"队列中点"<<endl;
		if(kj[px][py][pz]==100){//找到了终点 
		    cout<<"Escaped in "<<level<<" minute(s)."<<endl;
		    return ;
		}
		
		for(int i=0;i<6;i++){
			int x=px+dx[i];int y=py+dy[i];int z=pz+dz[i];
			//cout<<x<<" "<<y<<" "<<z<<" "<<vis[x][y][z]<<" "<<kj[x][y][z]<<endl;
			if(x>=l||x<0||y>=r||y<0||z>=c||z<0)continue;
			if(vis[x][y][z]==0&&kj[x][y][z]!=1){
				vis[x][y][z]=1;
				
				point pp1(x,y,z,level+1);
				xp.push(pp1);
			}
		}		
	}
	
	cout<<"Trapped!"<<endl;
}

int main(){
	
	while(cin>>l>>r>>c){
		
		while(!xp.empty() )xp.pop();
		if(l==0&&r==0&&c==0)break;	
	    
		int x,y,z;//起点的位置		
		for(int i=0;i<l;i++){
			for(int j=0;j<r;j++){
				for(int k=0;k<c;k++){
				    char c; cin>>c; 
					//cout<<c<<endl;
					if(c=='.')kj[i][j][k]=0;
					else if(c=='#')kj[i][j][k]=1;
					else if(c=='S'){
					    kj[i][j][k]=10;
					    x=i;y=j;z=k;
					}
					else if(c=='E'){
					    kj[i][j][k]=100;
					    //cout<<i<<" "<<j<<" "<<k<<endl;
					}
				}
			}
		}
		
		//cout<<111<<endl;
		
		bfs(x,y,z);
	}
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Week12 作业 B - 必做题(三维空间迷宫) 的相关文章

  • Maven打包提示dependencies.dependency.systemPath错误

    Maven打包提示dependencies dependency systemPath错误 具体信息如下 xff1a Some problems were encountered span class token keyword while
  • macbook桌面的文件突然消失的解决方案

    macos系统的的桌面文件突然间消失的解决方案 原因 有一天就突然发现我电脑桌面上的文件突然就不见了 xff0c 但是commad 43 空格键唤醒聚焦搜索 xff0c 搜索文件又能够找到我所消失的文件 xff0c 并且如果把原有的文件再一
  • 【cmake】搭配vcpkg的manifest模式实现自动安装第三方库

    cmake搭配vcpkg的manifest模式实现自动安装包 好处 类似于pip的requirements 你只需要指定该项目的依赖库 xff0c 就会自动运行vcpkg为你安装所有的依赖库 并且安装在当前项目build下面 这些第三方库与
  • python安装surprise库总是失败

    python安装surprise库缺乏组件的解决办法 1 背景 xff1a 2 明确问题3 找到资源包4 问题解决5 总结 1 背景 xff1a 在做一个用到django框架做音乐的推荐时 xff0c 由于要用到SVD算法 xff0c 需要
  • 通讯网络

    题面 Description 北极的某区域共有n座村庄 xff0c 每座村庄的坐标用一对整数 x y 表示 为了加强联系 xff0c 决定在村庄之间建立通讯网络 通讯工具可以是无线电收发机 xff0c 也可以是卫星设备 所有的村庄都可以拥有
  • Linux主机密码暴力破解

    一 目的 针对Linux主机SSH协议暴力破解过程以及漏洞原理和修复方式详细介绍 二 漏洞介绍 2 1 漏洞原因 由于主机用户没有设置密码或者设置了linux弱密码 xff0c 且未对主机设置严格的基线加固策略 xff0c 导致恶意攻击者可
  • CCF CSP认证201809-3 元素选择器

    201809 3 元素选择器 题目 思路 多级查询需要用到树形结构 xff0c 详见代码 AC代码如下 span class token macro property span class token directive keyword i
  • Week 11 必做题

    文章目录 11 1题目描述样例思路代码11 2题目描述样例思路代码11 3题目描述样例思路代码11 4题目描述样例思路代码 11 1题目描述 蒜头君从现在开始工作 xff0c 年薪 N 万 他希望在蒜厂附近买一套 60平米的房子 xff0c
  • Linux生成随机密码

    使用SHA算法来加密日期 xff0c 并输出结果的前10个字符 xff1a date span class token operator 43 span span class token operator span s span class
  • mac环境,安装anaconda,终端输入conda无效解决

    正常从官网下载安装包安装后 xff0c 打开终端 xff0c 配置conda环境变量 打开终端 xff0c 输入 vim bash profile 出现问题1 原因是 xff1a 存在了同名的文件 xff0c 但是这个同名的文件格式不一样
  • 前端实现一键复制,且不弹出软键盘

    前端实现一键复制 xff0c 且不弹出软键盘 直接上代码 直接上代码 span class token keyword function span span class token function downloadImg span spa
  • 【干货】阿里云ECS设置的安全组没有生效的解决方法

    问题描述 在ECS管理控制中设置对应端口的安全组规则 xff0c 但是未生效 问题原因 安全组配置错误 xff0c 导致规则未生效 解决方案 具体的解决方法请查看 xff1a https help aliyun com knowledge
  • 【干货】阿里云ECS安全组没有生效的解决办法

    解决方法 设置了ECS实例的安全组 xff0c 但是安全组没有生效 xff0c 可能是安全组配置错误 xff0c 所以没生效 xff0c 具体的解决方法请查看 xff1a https help aliyun com knowledge de
  • 使用ssl双向验证登录mysql

    1 检查服务端是否开启ssl认证 show variables like 39 ssl 39 2 确认用户强制使用ssl认证 use mysql username换成具体的用户 select ssl type from user where
  • Go-Qt5开发之Windows10安装配置(1)

    Go Qt5开发之Windows10安装配置 开发环境安装Qt xff0c 两种方式 xff08 这里采用官方版本方式 xff09 xff1a MSYS2 安装MSYS2介绍MSYS2是什么编辑安装更换国内源教程更换内容 通过以下命令来更新
  • Manjaro 常用软件安装

    Manjaro 常用软件安装 修改Home下的目录为英文 修改系统语言archlinuxcn keyringvimAUR浏览器谷歌浏览器 chrome火狐浏览器 Firefox360浏览器 360压缩搜狗拼音 JDK 安装中文字体仿制mac
  • 利用python实现本地文件上传到sftp

    实现功能 xff1a 利用python自动连接sftp xff0c 并实现本地文件 xff08 文件夹 xff09 自动上传到远程sftp服务中指定路径下 xff0c 且保持本地目录结构 系统环境 xff1a centos7 python版
  • Qt在不同平台上的安装

    Qt在不同平台上的安装 来源 愿码 ChainDesk CN 内容编辑愿码Slogan 连接每个程序员的故事网站 http chaindesk cn愿码愿景 打造全学科IT系统免费课程 xff0c 助力小白用户 初级工程师0成本免费系统学习
  • linux 查看当前文件夹位置

    Linux中查看当前所处的目录位置可以使用pwd命令 1 命令格式pwd 选项 2 命令功能查看 当前工作目录 的完整路径3 常用参数一般情况下不带任何参数如果目录是链接时 xff1a 格式 xff1a pwd P 显示出实际路径 xff0
  • chrome中任意修改网页内容

    作用 xff1a 1 去除AdBlock所不能完全清楚的广告 2 修改网页 步骤 xff1a 1 F12 2 Console控制台选项卡 3 命令输入框输入 document body contentEditable 61 34 true

随机推荐