http://acm.uestc.edu.cn/#/problem/show/1088

王之迷宫

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

王被困在了一个3维的迷宫中,他很想逃离这个迷宫回去当学霸,你能帮助他么? 由于王很仁慈,他悄悄地告诉你,本题读入迷宫的每一行时,要用scanf("%s"...) ......

Input

多组测试数据,对于每组测试数据,有三个整数 L,R,C(0<l,r,c≤30)。

L代表迷宫的高度,R和C分别代表每一层的行和列。

接下来是L个R×C的矩阵,矩阵包含4种字符(S,E,.,#),S代表王的初始位置,E代表出口,#代表障碍。.代表能通过的地方。

每一层之后有一个空行。

当L=R=C=0时,输入中断。

Output

如果可以逃离迷宫,按下列格式输出最短时间:

Escaped in x minute(s). (x表示逃离迷宫的最短时间, 走一步花费一昏钟)

否则,输出:

Trapped!

Sample input and output

Sample Input Sample Output
3 4 5
S....
.###.
.##..
###.# #####
#####
##.##
##... #####
#####
#.###
####E 1 3 3
S##
#E#
### 0 0 0
Escaped in 11 minute(s).
Trapped!

题解:三维迷宫,很简单的bfs。一开始wa了一发,后来发现是因为oj数据不规范,不能用getchar去消除空白符,得用%s过滤空白符。一方面有些抱怨oj数据坑爹,一方面总结教训,要有勇气敢于怀疑平台数据的正确性,改善自己程序的健壮性。

代码:

 #include <fstream>
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue> using namespace std; struct node{
int x,y,z,step;
}tmp; const int N=;
int l,r,c,x1,y1_,z1;
queue<node> pq;
char a[N][N][N];
bool b[N][N][N];
int co[][]={{,,,,,-},{,,,-,,},{,-,,,,}}; inline bool check(int x,int y,int z);
int bfs(); int main()
{
//freopen("D:\\input.in","r",stdin);
//freopen("D:\\output.out","w",stdout);
while(scanf("%d%d%d",&l,&r,&c)&&(l|r|c)){
bool bo=;
for(int i=;i<l;i++){
for(int j=;j<r;j++){
scanf("%s",a[i][j]);
if(bo)
for(int z=;z<c;z++){
if(a[i][j][z]=='S'){
x1=i,y1_=j,z1=z;
bo=;
break;
}
}
}
}
int ans=bfs();
if(ans==-) puts("Trapped!");
else printf("Escaped in %d minute(s).\n",ans);
}
return ;
}
inline bool check(int x,int y,int z){
return x>=&&x<l&&y>=&&y<r&&z>=&&z<c&&a[x][y][z]!='#'&&b[x][y][z]==;
}
int bfs(){
memset(b,,sizeof(b));
while(!pq.empty()) pq.pop();
tmp.step=;
tmp.x=x1;
tmp.y=y1_;
tmp.z=z1;
pq.push(tmp);
b[x1][y1_][z1]=;
while(!pq.empty()){
tmp=pq.front();
pq.pop();
int x=tmp.x,y=tmp.y,z=tmp.z;
int tx,ty,tz,ts=tmp.step+;
for(int i=;i<;i++){
tx=x+co[][i];
ty=y+co[][i];
tz=z+co[][i];
if(check(tx,ty,tz)){
b[tx][ty][tz]=;
if(a[tx][ty][tz]=='.'){
tmp.x=tx,tmp.y=ty,tmp.z=tz,tmp.step=ts;
pq.push(tmp);
}else{
return ts;
}
}
}
}
return -;
}

cdoj1088-王之迷宫 (三维迷宫最短路径)【BFS】的更多相关文章

  1. UVa532 Dungeon Master 三维迷宫

        学习点: scanf可以自动过滤空行 搜索时要先判断是否越界(L R C),再判断其他条件是否满足 bfs搜索时可以在入口处(push时)判断是否达到目标,也可以在出口处(pop时)   #i ...

  2. 逃离迷宫(HDU 1728 BFS)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. 逃离迷宫 HDU - 1728(bfs)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 一本通之 一堆迷宫 (Dungeon Master&走出迷宫&走迷宫)

    一本通在线崩溃....... . 有图有真相 这是个三维迷宫,其实和二位迷宫差不多,只是方向多加了2个. 但这个题的输入十分恶心,一度被坑的用cin.ignore(),但还是不过... 它的正确输入方 ...

  5. 最短路径——BFS算法

    最短路径--BFS算法 单源最短路径问题 每对顶点间的最短路径 BFS求无权图的单源最短路径 bool visited[MAX_VERTEX_NUM]; //访问标记数组 //广度优先遍历 void ...

  6. 2015 UESTC 搜索专题A题 王之迷宫 三维bfs

    A - 王之迷宫 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Des ...

  7. 迷宫的最短路径 (BFS)

    N*M的迷宫,从起点到终点,求最短距离 宽度优先搜索按照距开始状态由近及远的顺序进行搜索,因此可以很容易的用来求最短路径,最少操作之类问题的答案.  (可以构造成pair或者编码成int来表达状态) ...

  8. - 迷宫问题 POJ - 3984 bfs记录路径并输出最短路径

    定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...

  9. POJ - 3984迷宫问题(最短路径输出)

    题目链接:http://poj.org/problem?id=3984 题目: 迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

随机推荐

  1. redis在mac中的安装和启动

    http://blog.csdn.net/chenshuai1993/article/details/51519384 http://www.jianshu.com/p/6b5eca8d908b

  2. Google Chrome 调试JS简单教程[更新]

    题外话,刚开始我写这篇内容只是将自己了解的一些知识放上来,不巧的是我分析了我的来访日志,很多朋友都有这个需求,为了大家没有白来,我决定充实下这篇文章.最近更新时间2014-02-14 chrome版本 ...

  3. jsTree 是一个基于Javascript,支持多浏览器的Tree view jQuery插件。

    https://www.jstree.com/ 之前给大家介绍两种浮动闭合的办法CSS清除浮动 万能float闭合,得 http://www.daqianduan.com/3606.html

  4. jQuery的页面初始化操作写法

    $(document).ready(function(){ alert("第一种方法."); }); $(function(){ alert("第二种方法.") ...

  5. Oracle数据库clob字段导出为sql insert插入语句

    oracle数据库的clob字段导出为sql insert插入语句可以分三种情况:1,clob没有换行符:2,clob有换行符但不以分号结尾:3,clob有换行符并且以分号结尾. clob没有换行符使 ...

  6. (转)Inno Setup入门(十七)——Inno Setup类参考(3)

    本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250993 标签(Label)是用来显示文本的主要组件之一,也是窗 ...

  7. Appium+python自动化25-windows版appium_desktop_V1.7.1

    appium_desktop_v1.2.6 1.appium_desktop在github上最新下载地址:releases/tag/v1.2.6 2.下载后傻瓜式安装,然后启动appium,这个界面跟 ...

  8. 制作mysql数据快照

    在建立主从关系时,如果主上有旧数据,需要将旧数据拷贝到每一个从上.下面介绍几种不同的拷贝方式. 方法一:使用mysqldump工具创建一个你想要复制的所有数据库的一个dump.这是推荐使用的方法,特别 ...

  9. excel打开csv 出现乱码怎么解决

    CSV是逗号分隔值的英文缩写,通常都是纯文本文件.CSV格式是分隔的数据格式,有字段/列分隔的逗号字符和记录/行分隔换行符.通常CSV文件可以用EXCEL正常打开,但是许多人都有这样的经历,使用EXC ...

  10. shelve模块(超级好用~!)

    ''' python中的shelve模块,可以提供一些简单的数据操作 他和python中的dbm很相似. 区别如下: 都是以键值对的形式保存数据,不过在shelve模块中, key必须为字符串,而值可 ...