P2360 地下城主
题目大意
背景是逃离\(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 地下城主的更多相关文章
- 洛谷 P2360 地下城主
P2360 地下城主 题目描述 你参加了一项秘密任务,在任务过程中你被困在了一个3D的地下监狱里面,任务是计时的,你现在需要在最短的时间里面从地牢里面逃出来继续你的任务.地牢由若干层组成,每一层的形状 ...
- P2360 地下城主(BFS)
感觉这道题还是蛮简单的,不过使使用了4个队列(其实只是一个)emmmmm,还是很好的 #include<iostream> #include<string> #include& ...
- python练手项目
文本操作 逆转字符串--输入一个字符串,将其逆转并输出. 拉丁猪文字游戏--这是一个英语语言游戏.基本规则是将一个英语单词的第一个辅音音素的字母移动到词尾并且加上后缀-ay(譬如"banan ...
- 远程获得乐趣的 Linux 命令
今天是我们为期 24 天的 Linux 命令行玩具日历的最后一天.希望你一直有在看,但如果没有,请从头开始,继续努力.你会发现 Linux 终端有很多游戏.消遣和奇怪之处. 虽然你之前可能已经看过我们 ...
- (22)Python练习项目集
文本操作 逆转字符串——输入一个字符串,将其逆转并输出. 拉丁猪文字游戏——这是一个英语语言游戏.基本规则是将一个英语单词的第一个辅音音素的字母移动到词尾并且加上后缀-ay(譬如“banana”会变成 ...
- ZJUT 1423 地下迷宫(期望DP&高斯消元)
地下迷宫 Time Limit:1000MS Memory Limit:32768K Description: 由于山体滑坡,DK被困在了地下蜘蛛王国迷宫.为了抢在DH之前来到TFT,DK必须尽快走 ...
- SuperMap iObject入门开发系列之二地下三维管线系统介绍
本文是一位好友“托马斯”授权给我来发表的,介绍都是他的研究成果,在此,非常感谢. 上次对超图平台组件式开发进行介绍,这次介绍的是基于这个框架开发的地下三维管线系统.地下管线涉及给水.雨水.污水.燃气. ...
- PTA地下迷宫探索
地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...
- PTA 7-33 地下迷宫探索(深搜输出路径)
地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...
- pta习题集5-16 地下迷宫探索
地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...
随机推荐
- mysql根据mysqlbinlog恢复找回被删除的数据库
年初和朋友一起做了个项目,到现在还没收到钱呢,今天中午时候突然听说之前的数据库被攻击了,业务数据库全部被删除.看有没有什么办法恢复,要是恢复不了,肯定也别想拿钱了吧? README FOR RECOV ...
- asp.net core之日志
日志记录在应用程序开发中起着至关重要的作用,它可以帮助开发人员诊断和调试问题,同时也是监控和性能优化的重要工具.ASP.NET Core 提供了强大且灵活的日志记录功能,本文将详细介绍ASP.NET ...
- 如何为物联网设备注入“华为云+鸿蒙DNA”?
本文分享自华为云社区<如何为物联网设备注入"华为云+鸿蒙DNA"?看华为云IoT怎么答[华为云IoT +鸿蒙]>,作者: 华为IoT云服务. 根据市场咨询机构预测,20 ...
- 部分 Linux 换国内源
Centos 8 / Redhat 8 换国内源 操作步骤 先把原本的官方 yum 源 删除 或 备份 cd /etc/yum.repos.d/ 备份(Redhat 同理) rename repo r ...
- Combobox后台绑定
本文主要介绍WPF中Combobox的后台绑定,我在这里主要讲解数据驱动 1.对于前台绑定,我们首先写出想要绑定的对象 新建一个Models文件夹,将Student类写入 public class S ...
- SpringBoot+Mybatis-Plus+Mysql的保姆级搭建
本文通过简单的示例代码和说明,让读者能够了解Mybatis-Plus+Mysql的简单使用 必须说明的是,本文有部分内容是为了后续的微服务写的,所以如果只想用Mybatis-Plus的话,直接使用ba ...
- KMP字符串对比算法及next数组计算
(注:该贴主要运用python实现该算法) 先谈谈KMP算法吧.KMP算法的全称是Knuth-Morris-Pratt 算法,它是用来进行字符串查找,即在某个主字符串里面找到某个特定子字符串.但是好像 ...
- java类序列化和反序列化
参考:https://zhuanlan.zhihu.com/p/144535172?utm_id=0 https://blog.csdn.net/qq_42617455/article/details ...
- 「hackerrank - 101hack43」K-Inversion Permutations
link. 原问题即:请你给出不同的序列 \(\{a_n\}\) 的数量,满足 \(0\leqslant a_i<i\),且 \(\sum a_i=k\). 那么写出 \({a_n}\) 的 o ...
- [自然语言处理] 基于pycorrector实现文本纠错
文本纠错(Text Error Correction)技术旨在自动修正输入文本中的拼写.语法.标点符号等错误,以提高文本的准确性.通顺性和规范性.该技术可以通过自然语言处理技术实现,基于上下文和语言规 ...