Dungeon Master

Description - 题目描述

  你被困在一个3D地牢中且继续寻找最短路径逃生!地牢由立方体单位构成,立方体单位中有的会充满岩石。向上下前后左右移动一个单位需要一分钟。你不能向对角线的四个方向移动且迷宫四周环绕着许多岩石。 

  是否可以逃出地牢?如果可以,则需要多少时间? 

Input - 输入  输入的第一行包含一个数,表示地牢的数量。
  每个地牢的描述,其第一行包含三个数L,R和C(均小于等于30)。
  L表示地牢的层数;R和C分别表示每层地牢的行与列的大小。

  随后输入地牢的层数L,每层中包含R行,每行中包含C个字符。
  每个字符表示地牢的一个单元。'#'表示岩石单元,'.'表示空白单元。你的起始位置在点'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 Output - 输出样例

Escaped in 11 minute(s).
Trapped!
  思路:三维迷宫最短逃生路径,使用三维字符数组来存储迷宫信息,(我这里踩了个坑,把三维数组妖魔化了,认为其比二维数组要难很多,其实也就那样),输入多组测试用例首先
找到起点s,用起点s的三维坐标进行广搜,用int型三维数组判断该点是否访问过,遍历每一个点,当该点为终点E时,函数退出。要注意清空队列,初始化记录访问信息的数组。用结构体
存储迷宫信息下标。代码如下:
#include <iostream>
#include <algorithm>
#include <queue>
#include <string.h>
#define LL long long
const int max_n = 33;
using namespace std;
int l, r, c;
int dd[6][3]={1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1};//移动数组
int used[max_n][max_n][max_n];//记录访问信息数组
char mp[max_n][max_n][max_n];//迷宫信息
struct test {//迷宫下标
    int x,y,z;
    int time;//走到某点所花费的时间
};
queue<test> q;//队列,方便进行搜索
bool judge(int x, int y,int z)//判断该点下标是否合规
{
    return x >= 0 && x < r&&y >= 0 && y < c&&z>=0&&z<l;
}
int bfs(int sz, int sx, int sy)//搜索函数
{
    memset(used,0,sizeof(used));//初始化记录信息数组
    test a;
    a.x=sx,a.y=sy,a.z=sz;
    a.time=0;
    used[a.z][a.x][a.y]=1;
    q.push(a);//起点下标入队
    while(!q.empty())
    {
        test b=q.front();q.pop();//释放队首元素
        for(int i=0;i<6;i++)//进行遍历
        {
            test c;
            c.z=b.z+dd[i][0];
            c.x=b.x+dd[i][1];
            c.y=b.y+dd[i][2];
            if(mp[c.z][c.x][c.y]!='#'&&judge(c.x,c.y,c.z)&&used[c.z][c.x][c.y]==0)//当 某点小标没有越界、能走且没有到达过时
            {
                used[c.z][c.x][c.y]=1;//更改状态
                c.time=b.time+1;//时间+1
                q.push(c);//入队
                if(mp[c.z][c.x][c.y]=='E'){//当到达终点时,返回
                    return c.time;
                }
            }
        }
    }
    return 0;
}
int main()
{
    int sz, sx, sy;//起点下标
    while (scanf("%d %d %d", &l, &r, &c) == 3) {//输入无误时
        if (l == 0 && r == 0 && c == 0)break;//输入三个0结束输入
        for (int t = 0; t < l; t++)
        {
            for (int i = 0; i < r; i++)
            {
                for (int j = 0; j < c; j++)
                {
                    cin >> mp[t][i][j];
                    if (mp[t][i][j] == 'S')sz = t, sx = i, sy = j;
                }
            }
        }
        int su = 0;
        su = bfs(sz, sx, sy);
        if (su != 0)printf("Escaped in %d minute(s).\n", su);
        else printf("Trapped!\n");
        while (q.size())q.pop();//清空队列
    }
    return 0;
}

 

 

转载于:https://www.cnblogs.com/whocarethat/p/11094191.html

C++广度优先搜索算法之Dungeon Master Dungeon Master(地下城大师) Description(描述) You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled with rock. It take 阅读详情

相关推荐

突发环境事件怎么模拟?用Python+GIS实现高斯烟团模型(附完整代码)

本文详细介绍了如何利用Python与GIS技术实现高斯烟团模型,用于模拟化工泄漏等突发环境事件的动态扩散过程。通过核心原理讲解、参数快速获取方案、Python代码实现及GIS可视化集成,为环境应急人员提供了一套完整的解决方案。特别适合危险品运输事故等瞬态污染场景的应急决策支持。

weixin_33692284的博客 470

1248:Dungeon Maste

信息学奥赛一本通 1248:Dungeon Maste

pheatonhb的博客 521

量化交易新手必看:如何用Python快速接入XTP极速交易系统(附避坑指南)

本文为量化交易新手提供了使用Python快速接入中泰证券XTP极速交易系统的完整指南。文章详细介绍了XTP系统的微秒级性能优势、与CTP系统的核心区别,并逐步讲解了环境配置、API连接、资金查询、下单撤单等关键步骤,同时分享了网络维护、订单处理等实战避坑技巧,帮助开发者高效对接专业交易柜台。

life6的博客 621

信息学奥赛一本通 1248:Dungeon Master | OpenJudge NOI 2.5 1253:Dungeon Master

【题目链接】 ybt 1248:Dungeon Master OpenJudge 2.5 1253:Dungeon Master 【题目翻译】 地牢城主 描述 你被困在一个3D地牢中,需要找到可以走出地牢的最快的一条路。地牢由方块单位组成,方块中可能有或没有填满岩石。向东、南、西、北、上或下移动一个单位需要花费1分钟。你不可以向对角线方向移动。整个迷宫外各个方向都被坚硬的岩石包围。 是否可能逃脱呢?如果可能,需要用多久? 输入 输入包括一个地牢数字。每个地牢以包括L,R与C(大小都小于等于30三个整数的一

君义NOIP的博客 2974

信息奥赛一本通 - 1248: Dungeon Master

【代码】信息奥赛一本通 - 1248: Dungeon Master

关于C++只是的博客 733

信息学奥赛一本通 1248:Dungeon Master(evd)

【题目描述】 这题是一个三维的迷宫题目,其中用‘.’表示空地,‘#’表示障碍物,‘S’表示起点,‘E’表示终点,求从起点到终点的最小移动次数,解法二维的类似,只是在行动时除了东南西北移动外还多了上下。可以上下左右前后移动,每次都只能移到相邻的空位,每次需要花费一分钟,求从起点到终点最少要多久。 【输入】 多组测试数据。 一组测试测试数据表示一个三维迷宫: 前三个数,分别表示层数、一个面的长宽,后面是每层的平面图。前三个数据为三个零表示结束。 【输出】 最小移动次数。 【输入样例】 3 4 5 S… .#

everwide的博客 777

ybt1248_Dungeon Master

ybt1248_Dungeon Master 时空限制 1000ms/64MB 【题目描述】 这题是一个三维的迷宫题目,其中用‘.’表示空地,‘#’表示障碍物,‘S’表示起点,‘E’表示终点,求从起点到终点的最小移动次数,解法二维的类似,只是在行动时除了东南西北移动外还多了上下。可以上下左右前后移动,每次都只能移到相邻的空位,每次需要花费一分钟,求从起点到终点最少要多久。 【输入】...

HCSDN 774

uva 532 Dungeon Master(BFS)

uva 532 Dungeon Master You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled with rock. It takes one mi

总有那么一群人喜欢盯着我的博客看,估计这是他们见过最长的博客名,我必须得告诉他们博客名最长可以写多长 1029

poj-2251 Dungeon Master【bfs】

很基础的一道bfs /*这题是一个三维的迷宫题目,其中用'.'表示空地,'#'表示障碍物,'S'表示起点,'E'表示终点, 求从起点到终点的最小移动次数,解法二维的类似, 只是在行动时除了东南西北移动外还多了上下。 对于题目给出数据的含义就是输入l,r,c,分别代表迷宫有l层,每层长宽分别是c,r。 对于数据以可以这样移动 (1,1,1)->(1,1,2)->(1,1,3)->(1,1,4)-

a915800048的专栏 1397

一本通 1248Dungeon Master(思路问题)

来移动,只能在哪个点的下面传上去(这里就发生了不对)模拟,每一层各分各的(其实我们只需要记录当前的点是否。),剩下的就是bfs的移动了,注:这里的上下与在2维时不同。

ykx333的博客 246

POJ 2251 Dungeon Master地牢大师)

POJ2251 Dungeon Master地牢大师) TimeLimit:1000MSMemoryLimit:65536K Description- 题目描述   You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is c...

339

POJ 2251 Dungeon Master

POJ 2251 Dungeon Master You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled with rock. It takes one minute to move one unit north, south, east, west, up or down. You ca

Logan 3561

B - Dungeon Master[bfs]

B - Dungeon Master 一道bfs的题目 不同在于他并不是一个二维的迷宫,是一个三维的迷宫。 但其实什么都没有变,简单的bfs就能出答案 struct node{ int x,y,z; int step; }; queue <struct node> q; struct node head; char map[40][40][40];//图 int ...

rain_island的博客 257

三维bfs Dungeon Master POJ - 2251

三维bfs Dungeon Master POJ - 2251 题目链接 一直莫名其妙的错误 。。。 两种方法 一种用到队列 另一种其实也队列差不多 不用队列 #include&lt;stdio.h&gt; #include&lt;string.h&gt; #include&lt;iostream&gt; #include&lt;queue&gt; using namespace std; ...

qq_43559193的博客 550

poj 2251 Dungeon Master

dfs一定会超时的。 用bfs。 /* POJ: 2251 Dungeon Master */ #include #include #include #include #define M 35 using namespace std; const int dir[6][3] = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0,

stormdpzh的专栏 634

POJ 2251(WA)Dungeon Master(三维BFS)

POJ 2251 Dungeon Master 三维简单BFS You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled with rock. It takes one

No Rain,No L'Arc~en~Ciel 431

UVa 532 Dungeon Master

这道题目要求在三维迷宫中寻找从起点S到终点E的最短路径。迷宫由L层、R行C列的单元格组成,每个单元格可能是空地、岩石、起点或终点。每次移动可以朝六个方向(上下左右前后)移动一格,耗时1分钟。使用广度优先搜索(BFS)算法来探索最短路径,若找到终点则输出时间,否则输出无法到达的信息。代码处理多个迷宫输入,并通过队列实现BFS遍历,确保在三维网格中高效地找到最短路径。

寂静山林 255

HEU 1042 Dungeon Master

/**//************************************** Problem:HEU1042DungeonMaster Time:0.0090s Memory:916k AcceptedTime:2009-05-0619:19:33 Tips:注意计算层数的方法 ***********************************...

weixin_30832351的博客 219
上一篇: oracle 删除某个用户下的所有对象
下一篇: 命令行运行python项目文件,报错:ModuleNotFoundError: No module named 'xxxx' 解决办法...
weixin_30763397
博客等级 码龄11年 104粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值