Acwing---1096. 地牢大师

news2024/12/27 13:52:33

地牢大师

  • 1.题目
  • 2.基本思想
  • 3.代码实现

1.题目

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

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

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

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

请问,你有可能逃脱吗?

如果可以,需要多长时间?

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

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

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

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

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

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

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

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

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

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

数据范围
1 ≤ L , R , C ≤ 100 1≤L,R,C≤100 1L,R,C100

输入样例:
在这里插入图片描述

输出样例:

Escaped in 11 minute(s).
Trapped!

2.基本思想

数据量N为100,由于是3D,那么就是n3,就是100万,时间复杂度控制在O(n)中即可通过。

从起点-终点的最小步数可以直接通过BFS宽搜来进行获取,本题主要在于一些初始化操作会比较复杂麻烦些,bfs的宽搜代码就是基本模板。

3.代码实现

import java.util.*;
import java.io.*;

class Pos {
    int z, x, y;
    int dis;

    public Pos(int z, int x, int y, int dis) {
        this.z = z;
        this.x = x;
        this.y = y;
        this.dis = dis;
    }
}

class Main {
    static final BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
    static final int N = 110;
    //六个方向
    static final int[] dz = {0, 0, 0, 0, 1, -1};
    static final int[] dx = {0, 0, 1, -1, 0, 0};
    static final int[] dy = {1, -1, 0, 0, 0, 0};

    //每一轮读入地牢层数、行数、列数
    static int L, R, C;
    //构建三维地图
    static char[][][] mg = new char[N][N][N];
    //初始点与终点
    static Pos start, end;

    //深搜
    static int bfs() {
        //队列
        Queue<Pos> queue = new LinkedList<>();
        //加入起点
        queue.offer(start);
        while (!queue.isEmpty()) {
            //出队一个点
            Pos cur = queue.poll();
            //此时判断是否已经遇到终点
            if (cur.z == end.z && cur.x == end.x && cur.y == end.y) {
                return cur.dis;
            }
            //遍历六个方向
            for (int d = 0; d < 6; d++) {
                int z = cur.z + dz[d], x = cur.x + dx[d], y = cur.y + dy[d];
                //判断是否越界或者遇墙
                if (z < 1 || z > L || x < 1 || x > R || y < 1 || y > C || mg[z][x][y] == '#') {
                    continue;
                }
                //当前迷宫位置'.'设置为'#',这样就无需设置一个访问数组
                mg[z][x][y] = '#';
                //进行入队
                queue.offer(new Pos(z, x, y, cur.dis + 1));
            }
        }
        return -1;
    }

    public static void main(String[] args) throws Exception{
        while (true) {
            //读取LRC
            String[] ss = cin.readLine().split(" ");
            L = Integer.parseInt(ss[0]);
            R = Integer.parseInt(ss[1]);
            C = Integer.parseInt(ss[2]);
            //若是都读到0,那么结束
            if (L == 0 && R == 0 && C == 0) break;
            //地图初始化
            for (int z = 1; z <= L; z++) {
                for (int x = 1; x <= R; x++) {
                    //读取当前层的地牢
                    String line = cin.readLine();
                    for (int y = 1; y <= C; y++) {
                        mg[z][x][y] = line.charAt(y - 1);
                        //获取地图开始与结束位置
                        if (mg[z][x][y] == 'S') {
                            start = new Pos(z, x, y, 0);
                        }else if (mg[z][x][y] == 'E'){
                            end = new Pos(z, x, y, 0);
                        }
                    }
                }
                //读取多余一行
                cin.readLine();
            }
            //bfs(深搜)
            int dis = bfs();
            if (dis != -1) {
                System.out.printf("Escaped in %d minute(s).\n", dis);
            }else {
                System.out.printf("Trapped!\n");
            }
        }
    }


}

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

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

相关文章

Redis基于docker跨服务器的一主两从三哨兵集群模式搭建

文章目录1 整体拓扑图2 redis与哨兵配置文件2.1 主节点配置文件2.1.1 主节点redis.conf配置文件2.1.2 主节点哨兵配置文件2.2 从节点配置文件2.1.1 从节点redis.conf配置文件2.1.2 从节点哨兵配置文件3 docke-compose编排文件4 启动并测试查看哨兵日志查看集群状态测试集群是否…

Spring源码分析 (Spring启动过程之容器对象的创建) (十五)

点进去 1.this() 2.注册配置类 3.refresh() Spring会将所有交由Spring管理的类&#xff0c;扫描其class文件&#xff0c;将其解析成BeanDefinition&#xff0c;在BeanDefinition中会描述类的信息&#xff0c;例如:这个类是否是单例的&#xff0c;Bean的类型&#xff0c;是否是懒…

导向滤波算法——OpenGL实现

导向滤波 一、介绍 导向滤波又称引导滤波&#xff0c;通过一张引导图片反映边缘、物体等信息&#xff0c;对输入图像进行滤波处理&#xff0c;使输出图像的内容由输入图像决定&#xff0c;但纹理与引导图片相似。 导向滤波的原理是局部线性模型&#xff0c;在保持双边滤波的优…

【学习笔记】多线程

1、线程基础 1.1 创建线程的几种方式 继承Thread 类&#xff0c;覆盖run方法实现Runable接口。实现run方法。然后 通过Thread类构造方法获取Thread对象。实现Callable接口。实现call方法。 call方法可以抛出异常。也可以有返回值。 run与start 调用run方法任然是主线程在执行。…

这个 Python 游戏库,打开就能玩一天

会 Python 的小伙伴&#xff0c;选择用 Python 让“大风车”吱呦呦地转&#xff01;还有的小伙伴&#xff0c;选择用 Turtle 库绘制童年的卡通人物 我们其实还可以选择用 Python 开发小游戏&#xff0c;回忆童年的美好时光。 “凹凸版”吃豆子 这次并非用pygame制作的&#…

MyBatis超详细学习笔记(黑马)

目录 一、MyBatis快速入门 &#xff08;一&#xff09;打开MyBatis中文官网 &#xff08;二&#xff09;在工程中&#xff08;pom.xml&#xff09;导入MyBatis依赖 &#xff08;三&#xff09;编写MyBatis核心配置文件——替换连接信息&#xff0c;解决硬编码问题 &#x…

关于加强网络舆情监测的几点建议,TOOM强化舆情监控有方法

网络舆情监测是一项旨在通过监测网络上的舆情信息&#xff0c;了解社会舆论和网络话语状况&#xff0c;分析舆情动态&#xff0c;预测舆情走向&#xff0c;并进行舆情管控的工作。主要通过计算机技术和信息科学手段对网络信息进行收集、整理、分析和报告&#xff0c;以便于管理…

Golang - 操作Redis

Golang - 操作Redis go-redis是Golang语言连接、操作Redis服务的客户端&#xff0c;几乎包含了对Redis的所有操作&#xff0c;具体如下&#xff1a; 简单易用 兼容多种Redis部署架构,可用于Redis服务器、Redis群集、Redis Sentinel&#xff0c;甚至Redis服务器环go-redis 支持…

配置TF-A源码

配置TF-A源码 1.对tf-a源码进行解压 $> tar xfz tf-a-stm32mp-2.2.r2-r0.tar.gz 2.打补丁 进入/home/ubuntu/FSMP1A/tf-a-stm32mp-2.2.r2-r0/tf-a-stm32mp-2.2.r2目录 执行 for p in ls -1 ../*.patch; do patch -p1 < $p; done 3.配置工具链 1)进入/home/ubuntu/FS…

05 CSS-CSS语法【尚硅谷JavaWeb教程】

05 CSS-CSS语法【尚硅谷JavaWeb教程】 JAVAWEB的学习笔记 学习视频来自&#xff1a;https://www.bilibili.com/video/BV1AS4y177xJ/?vd_source75dce036dc8244310435eaf03de4e330 为什么需要CSS 传统的园区网络采用设备和链路冗余来保证高可靠性&#xff0c;但其链路利用率低、…

Task7:动态函数

目录注意一 Filter函数二 Subtotal函数注意 filter&#xff0c;目前只有office365支持 一 Filter函数 作用&#xff1a;需要根据指定的条件&#xff0c;将符合条件的所有记录从数据源表格式查找过来之前方法&#xff1a; 用高级筛选&#xff08;缺点&#xff1a;在查询下一个…

SAP ADM100-Unit4 数据库工作原理:中央数据库管理与DBA Cockpit

概览 本节介绍DBA Cockpit,介绍SAP环境下数据库管理和监控的要点。 使用DBA Cockpit计划日历去计划数据和日志信息的周期性备份。 课程目标 备份数据库内容 检查数据库备份是否成功被执行。 1、DBA Cockpit总览 为了最少的系统停机时间和更高的系统性能,必须计划定期的…

云计算|OpenStack|社区版OpenStack安装部署文档(一 --- 前期硬件准备和部署规划)

前言&#xff1a; 社区版OpenStack是比较难以安装部署的&#xff0c;本文将就安装部署做一个详细的说明。 首先&#xff0c;OpenStack社区版本众多&#xff0c;如何选择一个合适的版本是第一个要解决的问题&#xff08;这里的合适是指的OpenStack版本和操作系统的版本合适&am…

MATLAB-自动控制原理-时域分析

目录 step函数&#xff08;求阶跃响应&#xff09;: impulse函数&#xff08;求脉冲响应&#xff09;: lsim函数&#xff08;求输出&#xff09;: 1&#xff0c;求二阶系统不同阻尼比条件下的阶跃响应曲线 2&#xff0c;求二阶负反馈系统的动态性能指标 利用MATLAB可以方…

五、好友关注,feed流推送

文章目录关注和取消关注&#xff0c;共同关注Feed流推送Feed介绍Timeline推模式Feed流滚动分页滚动分页查询收邮箱官方命令文档&#xff1a;https://redis.io/commands/ 关注和取消关注&#xff0c;共同关注 需求&#xff1a; 可以对一个用户进行关注和取消关注查询和一个用…

深刻理解状态机设计需要避免的冒险;处理单元里的control和datapath;时序电路可能存在essential hazard;竞争冒险【SV】【VLSI】

深刻理解状态机设计需要避免的冒险&#xff1b;处理单元里的control和datapath&#xff1b;时序电路可能存在essential hazard&#xff1b;竞争冒险【SV】【VLSI】0. 前言&#xff1a;时序电路可能存在essential hazard1. 理解control和datapath1.1 Datapath control2. 硬件电路…

JavaScript XHR、Fetch

前后端分离的优势 ◼ 早期的网页都是通过后端渲染来完成的&#xff1a;服务器端渲染&#xff08;SSR&#xff0c;server side render&#xff09;&#xff1a; \qquad 客户端发出请求-> 服务端接收请求并返回相应HTML文档-> 页面刷新&#xff0c;客户端加载新的HTML文…

如何采用conda配置python虚拟环境

文章目录一、创建python虚拟环境二、配置刚创建的虚拟环境三、将虚拟环境配置到相应项目一、创建python虚拟环境 首先选中要配置环境的文件 如下&#xff1a; 在此处输入cmd按回车 此处我创建一个环境名为hands3dtext&#xff0c;环境版本为3.7.2的初始环境 conda create -n…

Visual Studio 2015配置OpenCV4.5.3(c++版)

学习目标学会在Visual Studio 2015部署Opencv一个简单的C Opencv实例一、 Visual Studio 2015配置Opencv4.5.31.1 Visual Studio 2015网上关于Visual Studio 2015的下载&#xff0c;也有很多介绍。大家自行搜索安装。1.2 OpenCVOpenCV大家根据需求下载相应版本&#xff0c;官网…

ObjectARX如何修改多行文字的格式

一 AutoCAD中多行文字的格式设置 AutoCAD在设置多行文字格式时使用了非常特殊的方式&#xff0c;多行文字整体可以有诸多格式属性&#xff0c;比如字高、颜色、旋转角度等等&#xff1b;但是&#xff0c;多行文字的每一个字符其实也可以有自己单独的格式。 比如&#xff0c;下…