B - Xiper的奇妙历险(2)
来源:互联网 发布:java程序员考证 编辑:程序博客网 时间:2024/04/30 20:19
B - Xiper的奇妙历险(2)
Time Limit: 3000/1000MS (Java/Others)
题目链接:
http://acm.uestc.edu.cn/#/contest/show/99
题目:
转眼间,已经过了10年。
毕业之后,
久而久之,
日天面对
然而就在
“我不做人啦,
潘警官赶忙掏出光剑,向日天砍去。不料成为咸鱼王的日天已然是刀枪不入,毫发无损。
面对强大的日天,
在
现在,已经打败了日天的
为了简化问题,我们将房子简化成一个
.—— 表示该位置为空。
x—— 表示该位置上有障碍,不能移动。
U—— 表示上楼的楼梯入口。
D—— 表示下楼的楼梯入口。
X—— 表示
Y —— 表示
每秒
保证顶楼没有上楼入口,底层没有下楼入口,每个下楼入口对应的出口只会是上楼入口或者障碍,反之亦然。
一个上楼入口只会对应一个下楼入口,且所在层数相邻,所处的行和列一致,反之亦然。
注意,同一层楼可能存在多个楼梯;当楼梯入口对应的出口被障碍堵住时,
现在
Input
第一行三个数字
接下来从第
Output
如果可以到达,输出一个数
Sample Input
1 1 2XY12 2 2YU..XDxx
Sample Output
3
分析:
题目大概就是有第三维迷宫了,要从X走到Y,如果下楼或上楼的时候遇到障碍则走不到终点。
三维bfs~
代码:
#include<cstdio>#include<queue>using namespace std;int n, l, r;const int maxn = 51;struct node{ int x, y, z;};node make_node(int a, int b, int c){ node tmp; tmp.x = a; tmp.y = b; tmp.z = c; return tmp;}node st, en;int dx[4] = { 0, 1, 0, -1 }, dy[4] = { 1, 0, -1, 0 };int d[maxn][maxn][maxn];char mp[maxn][maxn][maxn];void init(){ for (int i = 0; i<51; i++) for (int j = 0; j<51; j++) for (int k = 0; k<51; k++) d[i][j][k] = -1;}int bfs()///it has begin and end{ init(); queue<node>que; que.push(st); d[st.z][st.x][st.y] = 0; while (!que.empty()) { node p = que.front(); que.pop(); if (mp[p.z][p.x][p.y] == 'Y')break; for (int i = 0; i<4; i++) { int nx = p.x + dx[i], ny = p.y + dy[i]; if (nx >= 0 && nx<l&&ny >= 0 && ny <= r&&d[p.z][nx][ny] == -1 && mp[p.z][nx][ny] != 'x') { d[p.z][nx][ny] = d[p.z][p.x][p.y] + 1; que.push(make_node(nx, ny, p.z)); } } if (mp[p.z][p.x][p.y] == 'U'&&p.z + 1<n&&mp[p.z + 1][p.x][p.y] != 'x'&&d[p.z + 1][p.x][p.y] == -1){ d[p.z + 1][p.x][p.y] = d[p.z][p.x][p.y] + 1; que.push(make_node(p.x, p.y, p.z + 1)); } if (mp[p.z][p.x][p.y] == 'D'&&p.z - 1 >= 0 && mp[p.z - 1][p.x][p.y] != 'x'&&d[p.z - 1][p.x][p.y] == -1){ d[p.z - 1][p.x][p.y] = d[p.z][p.x][p.y] + 1; que.push(make_node(p.x, p.y, p.z - 1)); } } return d[en.z][en.x][en.y];}int main(){ while (~scanf("%d%d%d", &n, &l, &r)) { for (int i = 0; i<n; i++) for (int j = 0; j<l; j++) for (int k = 0; k<r; k++){ scanf("%c", &mp[i][j][k]); if (mp[i][j][k] == 'X') { st.z = i; st.x = j; st.y = k; } if (mp[i][j][k] == 'Y') { en.z = i; en.x = j; en.y = k; } } int ans = bfs(); printf("%d\n", ans); }}
- B - Xiper的奇妙历险(2)
- 【Search&String Algorithm Training】Xiper的奇妙历险(2)
- 2016 UESTC Training Search Algorithm and StringB - Xiper的奇妙历险(2)(三维迷宫)
- 【Search&String Algorithm Training】Xiper的奇妙历险(1)
- CDOJ (UESTC OJ) 1380 Xiper的奇妙历险(3)
- 【cdoj 1380】 Xiper的奇妙历险(3) bfs+逆向思维 有质量的bfs
- 2016 UESTC Training for Search Algorithm & String A - Xiper的奇妙历险(1) 八皇后问题、dfs
- 【CodeForces 788B】奇妙的一笔画问题
- 奇妙的系统性能问题(2)
- 奇妙的图片
- 行为学奇妙的联觉
- 奇妙的网络世界
- 奇妙的堆栈
- auto_ptr_ref的奇妙
- 奇妙的Base64编码
- 奇妙的“秒”世界
- 奇妙的7
- 奇妙的图片
- scanf读取数值类型数据会在缓冲区中留下'\n'
- JDBC应用程序连接数据库--事务处理
- leetcode-28-Implement strStr()
- idea自动生成junit测试代码配置
- 负值之美:负margin在页面布局中的应用
- B - Xiper的奇妙历险(2)
- Inheritance继承
- 我的第一篇CSDN博客
- iOS知识点整理-RunLoop
- 常用的软件测试方法
- Picasso源码初探
- Android Accessibility自动安装app
- makefile之显示命令
- Hello World