程序设计思维与实践 Week12 作业B - 必做题 - 2

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!

Example

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

##.##
##…

#.###
####E

1 3 3
S##
#E#

0 0 0

Output
Escaped in 11 minute(s).
Trapped!

思想

本题利用三维+bfs可解:分别走6个方向,最早满足条件的就是最短时间

  • 与二维迷宫的不同之处在于:移动方向有六个,坐标(x,y,z)
int move[6][3] = {{0, 0, 1},{0, 0, -1},{0, -1, 0},{0, 1, 0},{1, 0, 0},{-1, 0, 0}};
  • 判断条件要考虑全面(可走、在范围内、未走过)
migong[newnode.z][newnode.x][newnode.y]!='#'&&
newnode.z>=0&&newnode.z<l&&newnode.x>=0&&newnode.x<r&&newnode.y>=0&&newnode.y<c&&
!mark[newnode.z][newnode.x][newnode.y])
  • 注意(z,x,y)与(i,j,k)的对应,在三维数组中第一维是本题中的层数(z)
  • 注意提前记录起点位置,起点不一定是(0,0,0)

代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <queue>
using namespace std;

char migong[50][50][50];
int move[6][3] = {{0, 0, 1},{0, 0, -1},{0, -1, 0},{0, 1, 0},{1, 0, 0},{-1, 0, 0}};
int l,r,c;
bool mark[50][50][50];
struct node
{
	int x,y,z;
	int step;
};

node node1;

void bfs()
{
	mark[0][0][0]=1;
	queue<node> q;
	q.push(node1);
	while(!q.empty())
	{
		node1=q.front();
		q.pop();
		if(migong[node1.z][node1.x][node1.y]=='E')
		{
			printf("Escaped in %d minute(s).\n",node1.step);
			return;
		 } 
		for(int i=0;i<6;i++)
		{
			node newnode;
			newnode.z=node1.z+ move[i][0];
			newnode.x=node1.x+ move[i][1];
			newnode.y=node1.y+ move[i][2];
			newnode.step=node1.step;
			//条件判断
			if(migong[newnode.z][newnode.x][newnode.y]!='#'&&
			newnode.z>=0&&newnode.z<l&&newnode.x>=0&&newnode.x<r&&newnode.y>=0&&newnode.y<c&&
			!mark[newnode.z][newnode.x][newnode.y])
			{
				mark[newnode.z][newnode.x][newnode.y]=1;
				newnode.step++;
				q.push(newnode);
			} 
		}
	}
	printf("Trapped!\n");
}
int main()
{
	while(~scanf("%d%d%d",&l,&r,&c))
	{
		if(l==0&&r==0&&c==0)  return 0;
		memset(mark,0,sizeof(mark));
		for(int i=0;i<l;i++)
		{
			for(int j=0;j<r;j++)
			{
				scanf("%s",migong[i][j]);
				for(int k=0;k<c;k++)
				{
					if(migong[i][j][k]=='S')  //记录起点位置 
					{
						node1.z=i;
						node1.x=j;
						node1.y=k;
						node1.step=0; 
					}
				}
			}
		 } 
		mark[0][0][0]=1;
		bfs();
	}
	return 0; 
 } 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序设计思维与实践 Week12 作业B - 必做题 - 2 的相关文章

  • NAT和PAT的原理及配置

    文章目录 一 NAT1 NAT概述2 私有地址3 NAT工作原理4 NAT功能5 NAT包含4类地址6 NAT的实现方式 二 静态转换 xff08 Static Translation xff09 三 动态转换 xff08 Dynamic
  • Linux系统安装教程(手把手教学)

    文章目录 1 首先 xff0c 打开虚拟机 xff0c 点击新建虚拟机2 点击下一步 xff0c 再点击稍后安装3 操作系统选择Linux xff0c 版本选择CentOS7 64位4 命名虚拟机5 设置磁盘大小为100GB6 设置内存为4
  • NFS共享存储服务

    文章目录 引言一 NFS概述二 安装 nfs utils rpcbind 软件包三 NFS的特点四 实验步骤1 安装nfs和rpcbind软件2 设置共享目录3 启动 NFS服务并验证结果4 客户机中访问 NFS 共享资源4 1 手动挂载
  • 优化命令之Sar命令

    文章目录 引言一 sar简介1 sar命令常用格式2 常用选项3 常用参数 二 Sar常用性能数据三 CPU资源监控1 整体CPU使用统计 xff08 u xff09 2 各个CPU使用统计 P 3 将CPU使用情况保存到文件中 四 内存监
  • MySQL高级SQL语句

    文章目录 引言一 常用查询1 order by按关键字排序1 1 升序排序1 2 降序排序1 3 结合where进行条件过滤再排序1 4 多字段排序 2 and or判断2 1 and or 且与或的使用2 2 嵌套 多条件使用 3 dis
  • MongoDB搭建及基础操作

    文章目录 引言一 MongoDB概述1 什么是MongoDB2 MongoDB的特点3 MongoDB适用场景4 MongoDB概念解析 二 搭建MongoDB1 关闭系统防火墙和安全机制2 配置mongodb源仓库3 安装mongodb4
  • 【云原生之k8s】k8s之持久化存储PV、PVC

    文章目录 一 PV和PVC1 PV 概念2 PVC概念3 PV 与 PVC 之间的关系3 1 PV和PVC的生命周期3 2 一个PV从创建到销毁的具体流程3 3 三种回收策略3 4 查看pv pvc的定义方式 规格 4 两种PV的提供方式
  • react native 这样理解运行机制

    移动开发中 xff0c native开发性能和效果上无疑是最好的 但是在众多的情况下 xff0c native开发并不是最优的选择 当需求经常改动的时候 xff0c 当预算有限的时候 xff0c 当deadline很近的时候 xff0c n
  • Promethues原理详解

    目录 引言 一 Prometheus 概述 1 什么是Prometheus 2 Zabbix和Prometheus区别 3 Prometheus的特点 二 运维监控平台设计思路 三 Prometheus监控体系 1 系统层监控 xff08
  • Prometheus部署、操作及Grafana展示

    目录 一 部署Prometheus xff08 192 168 109 18 xff09 1 环境准备工作 2 普罗米修斯的部署 2 1 上传 prometheus 2 37 0 linux amd64 tar gz 到 opt 目录中 x
  • 云原生--kubectl命令汇总

    目录 1 kubectl自动补全 2 kubectl上下文和配置 3 创建对象 4 显示和查找资源 5 更新资源 6 修补资源 7 编辑资源 8 scale资源 9 删除资源 10 与运行中的pod交互 11 与节点和集群交互 12 资源类
  • 计蒜客 - T1096 - 石头剪刀布

    计蒜客 T1096 石头剪刀布 题目 石头剪刀布是常见的猜拳游戏 石头胜剪刀 xff0c 剪刀胜布 xff0c 布胜石头 如果两个人出拳一样 xff0c 则不分胜负 一天 xff0c 小 A 和小B正好在玩石头剪刀布 已知他们的出拳都是有周
  • Docker保姆级教程:用Dockerfile文件构建专属于你的镜像

    初学者想要详细的了解docker可以去Docker菜鸟教程仔细学习 xff0c 本文只展示使用docker部署代码的全部过程 操作系统是ubuntu xff1a 18 04 xff08 tip xff1a 一定要了解docker是什么 xf
  • Windows安装tar.gz格式文件的方法

    首先下载tar gz文件 xff0c 比如我准备安装python docx的库文件 xff1a python docx 0 8 6 tar gz xff0c 下载后是一个tar gz文件 xff0c 解压软件解压 xff0c 解压后的目录里
  • SQL单表查询语句及其示例

    主要包括模糊查询 排序 别名查询 条件查询 逻辑运算and or in 分页显示 单表查询 新建表 xff08 商品分类表 xff09 商品ID 商品分类名称 商品描述 1 香烟酒水 二锅头 xff0c 女儿红 2 皮鞋箱包 江南皮革厂打造
  • WIN10安装sedatools,出现蓝屏代码为PAGE_FAULT_IN_NONPAGED_AREA,提示重启原因是因为hardlock.sys。

    安装sedatools的方法是从b站上搜索 xff08 直接搜索silvaco xff0c up主为向上生长的谛听 xff09 在安装的时候刚开始setup不上 xff0c 然后通过开启windows的安全模式 xff0c 得以安装成功 x
  • 视频超分算法VESPCN:Real-Time Video Super-Resolution with Spatio-Temporal Networks and Motion Compensation

    这篇文章基于ESPCN提出了针对视频重建任务的网络结构VESPCN ESPCN在图像和视频重建任务上都相比先前的方法都有一定的提升 xff0c 但ESPCN只能对单帧图像进行重建 xff0c 并不能利用视频多帧图像的时间相关性信息 该模型由
  • 图像超分算法小合集三:RCAN、SRLUT、ESPCN、VESPCN(混进来一个VSR)

    目录 RCANSRLUTESPCNVESPCN 本文只是简单介绍这些文章的算法和网络结构 xff0c 详细内容可以在我的博客内找 xff0c 这几篇里SRLUT是比较新的 2021 原文链接 xff1a RCAN Image Super R
  • 终端IO termios结构

    所有我们可以检测和更改的终端设备特性都包含在termios结构中 typedef unsigned char cc t 26 typedef unsigned int speed t 27 typedef unsigned int tcfl
  • Could not get JDBC Connection nested exception is java.sql.SQLException解决办法

    一般有两种情况会报这种错 第一种 连接地址写错 缺符合 打错字母都有可能 eg 难以发现的错误实例 正确写法 第二种情况 版本不同driver配置不同 6 0以下 6 0以上多了个cj 最后这些都没问题的话 那就是jdbc版本和mysql版

随机推荐