题目大意

背景是逃离\(3D\)地下监狱,也就是三维样例,你可以前往所在小格的前方,后方,左方,右方,上层,下层的小格,'.'表示可走,'x'表示墙壁,'S'表示起点,'E'表示终点。每走一小格花费一分钟时间,求逃离地下监狱需要的最少时间。(原题链接:P2360 地下城主

输入格式:

第一行:\(l\)表示有多少层,\(r\)表示一层有多少行,\(c\)表示一行有多少个

接下来:\(l\)个矩阵,表示监狱的每一层

输出格式:

一个数:所要花费的最少时间

如果能成功逃离输出:“\(Escaped\) \(in\) \(x\) \(minute(s)\)”,否则输出“\(Trapped!\)”

输入样例:

3 4 5

S....

.xxx.

.xx..

xxx.x

xxxxx

xxxxx

xx.xx

xx...

xxxxx

xxxxx

x.xxx

xxxxE

输出样例

Escaped in 11 minute(s).

思路:

这道题明显是使用\(BFS\)的,但是知道用\(BFS\)平时都是搜索那种两维的,这次是三维的怎么搞,第一想法是压缩成两维,可是真的太抽象了。。。

于是看了一下题解是说直接把数组改成三维就好了嘛,这样看来,这道题好水啊,,,

于是我显示用了三个数组

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

然后我又是这样枚举的

for(int i = 0; i < 4; i++)
for(int i = 0; i < 2; i++)
int xx = t.x + dx[i], yy = t.y +dy[i], zz = t.z + dz[j];

然后就爆零了。。

为什么dist数组根本没有得到更新,调试了一下,发现,我们一次只能做一个动作(前后上下左右,不能直接右上右下这样走),因此发现了问题,把代码改成了这样。

dx[6] = {-1, 0, 1, 0, 0, 0}
dy[6] = {0, 1, 0, -1, 0, 0}
dz[6] = {0, 0, 0, 0, -1, 1};
for(int i = 0; i < 6; i++)
int xx = t.x + dx[i], yy = t.y +dy[i], zz = t.z + dz[i];

顺利\(AC\)

第一次做三维\(BFS\),觉得挺典型的 记录一下~

代码

#include <iostream>
#include <cstring>
#include <queue>
using namespace std; const int N = 35;
int l, r, c, bx, by, bz, ex, ey, ez; //l是一共几层 r是每层几行 c是每行几个
int dist[N][N][N];
int mp[N][N][N];
int dx[6] = {-1, 0, 1, 0, 0, 0}, dy[6] = {0, 1, 0, -1, 0, 0}, dz[6] = {0, 0, 0, 0, -1, 1}; struct node
{
int x, y, z;
}; void bfs(int sx, int sy, int sz)
{
memset(dist, -1, sizeof dist);
queue<node> q;
node start;
start.x = sx, start.y = sy, start.z = sz;
q.push(start);
dist[sx][sy][sz] = 0; while(q.size())
{
auto t = q.front();
q.pop(); for(int i = 0; i < 6; i++)
{
int xx = t.x + dx[i], yy = t.y +dy[i], zz = t.z + dz[i];
if(zz >= 1 && zz <= l && xx >= 1 && xx <= r && yy >= 1 && yy <= c && dist[xx][yy][zz] == -1 && mp[xx][yy][zz] != -1)
{
dist[xx][yy][zz] = dist[t.x][t.y][t.z] + 1;
node p;
p.x = xx, p.y = yy, p.z = zz;
q.push(p);
}
if(mp[xx][yy][zz] == 'E') return;
}
}
} int main()
{
cin >> l >> r >> c;
for(int z = 1; z <= l; z++)
{
for(int x = 1; x <= r; x++)
{
for(int y = 1; y <= c; y++)
{
char c;
cin >> c;
if(c == 'S') //起点
{
mp[x][y][z] = 2;
bx = x, by = y, bz = z;
}
else if(c == '#') mp[x][y][z] = -1; //障碍
else if(c == '.') mp[x][y][z] = 1; //可走
else if(c == 'E') //终点
{
mp[x][y][z] = 3;
ex = x, ey = y, ez = z;
}
}
}
} bfs(bx, by, bz); if(dist[ex][ey][ez] == -1) cout << "Trapped!" << endl;
else cout << "Escaped in " << dist[ex][ey][ez] << " minute(s)." << endl; return 0;
}

P2360 地下城主的更多相关文章

  1. 洛谷 P2360 地下城主

    P2360 地下城主 题目描述 你参加了一项秘密任务,在任务过程中你被困在了一个3D的地下监狱里面,任务是计时的,你现在需要在最短的时间里面从地牢里面逃出来继续你的任务.地牢由若干层组成,每一层的形状 ...

  2. P2360 地下城主(BFS)

    感觉这道题还是蛮简单的,不过使使用了4个队列(其实只是一个)emmmmm,还是很好的 #include<iostream> #include<string> #include& ...

  3. python练手项目

    文本操作 逆转字符串--输入一个字符串,将其逆转并输出. 拉丁猪文字游戏--这是一个英语语言游戏.基本规则是将一个英语单词的第一个辅音音素的字母移动到词尾并且加上后缀-ay(譬如"banan ...

  4. 远程获得乐趣的 Linux 命令

    今天是我们为期 24 天的 Linux 命令行玩具日历的最后一天.希望你一直有在看,但如果没有,请从头开始,继续努力.你会发现 Linux 终端有很多游戏.消遣和奇怪之处. 虽然你之前可能已经看过我们 ...

  5. (22)Python练习项目集

    文本操作 逆转字符串——输入一个字符串,将其逆转并输出. 拉丁猪文字游戏——这是一个英语语言游戏.基本规则是将一个英语单词的第一个辅音音素的字母移动到词尾并且加上后缀-ay(譬如“banana”会变成 ...

  6. ZJUT 1423 地下迷宫(期望DP&高斯消元)

    地下迷宫 Time Limit:1000MS  Memory Limit:32768K Description: 由于山体滑坡,DK被困在了地下蜘蛛王国迷宫.为了抢在DH之前来到TFT,DK必须尽快走 ...

  7. SuperMap iObject入门开发系列之二地下三维管线系统介绍

    本文是一位好友“托马斯”授权给我来发表的,介绍都是他的研究成果,在此,非常感谢. 上次对超图平台组件式开发进行介绍,这次介绍的是基于这个框架开发的地下三维管线系统.地下管线涉及给水.雨水.污水.燃气. ...

  8. PTA地下迷宫探索

    地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...

  9. PTA 7-33 地下迷宫探索(深搜输出路径)

    地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...

  10. pta习题集5-16 地下迷宫探索

    地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...

随机推荐

  1. failed (2: No such file or directory) in /var/www/QQ_Music/nginx.conf:18

    错误原因 解决方案 引入文件 /www/server/nginx/conf/mime.types;

  2. jQuery真伪数组转换

    // 真数组转伪数组 [].push.apply(obj,arr); // 伪数组转真数组 [].slice.call(obj);

  3. [python]enumerate迭代

    Python中有个内置的函数叫做 enumerate,可以在迭代时返回元素的索引. # 示例代码01 warframe = ["saryn", "wisp", ...

  4. [ABC305C] Snuke the Cookie Picker题解

    题目大意 有一个 \(H\times W\) 的网格,一种有一个矩形,矩形中间有一个点被挖空,求这个点的坐标.(. 表示空白,# 表示矩形内的点) 解析 观察我们可以发现,每一矩形内的个点上下左右至少 ...

  5. 【路由器】小米 WR30U 解锁并刷机

    本文主要记录个人对小米 WR30U 路由器的解锁和刷机过程,整体步骤与 一般安装流程 类似,但是由于 WR30U 的解锁 ssh 和刷机的过程中有一些细节需要注意,因此记录一下 解锁 ssh 环境准备 ...

  6. Linux 内核设备驱动程序的IO寄存器访问 (上)

    Linux 内核提供了一套可缓存的设备 IO 寄存器访问机制,即 regmap.regmap 机制支持以统一的接口,访问多种不同类型的设备 IO 寄存器,如内存映射的设备 IO 寄存器,和需要通过 I ...

  7. Programming abstractions in C阅读笔记:p130-p131

    <Programming Abstractions In C>学习第52天,p130-p131,总结如下: 一.技术总结 1. pig latin game 通过pig latin gam ...

  8. HDU 1171 0-1背包

    最近感觉DP已经完全忘了..各种爆炸,打算好好复习一发,0-1背包开始 Big Event in HDU Problem Description Nowadays, we all know that ...

  9. mysql关键字匹配度模糊查询

    有时候项目中需要进行模糊查询,但是要对查询出来的结果进行匹配度排序,比如搜索关键字是"北",需要把数据库中第一个字是北的排在前面,此时就可以用mysql的INSTR函数. INST ...

  10. .NET应用多语言-葡萄牙语软件,如何处理本地化,特别是数字的转换和计算

    在葡萄牙语软件中,数字本地化通常涉及小数点和千位分隔符的使用.在葡萄牙语中,小数点用","表示,而不是英语中使用的".".千位分隔符通常是一个空格或一个点. 例 ...