POJ 2251

  题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间。不同L层的地图,相同RC坐标处是相连通的。(.可走,#为墙)

  解题思路:从起点开始分别往6个方向进行BFS(即入队),并记录步数,直至队为空.若一直找不到,则困住。

/* POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路) */
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; int n, m, o; //n行m列,o为层
char mapp[][][];
bool visit[][][]; //标记访问状态 /* 构造队列元素 (点位置+步数)*/
struct Point{
int x, y, z;
int step;
Point(){}
Point(int a, int b, int c, int d) :x(a), y(b), z(c), step(d){}
}; /* 判断点是否满足访问条件 */
inline bool judge(Point tmp){
if (mapp[tmp.x][tmp.y][tmp.z] == '#' || visit[tmp.x][tmp.y][tmp.z]
|| tmp.x < || tmp.x >= o || tmp.y < || tmp.y >= n
|| tmp.z < || tmp.z >= m
){
return ;
}
return ;
} /* x0为深度 y0,z0为同一层坐标 */
void bfs(int x0, int y0,int z0){
queue<Point> q;
bool found = ;
visit[x0][y0][z0] = ; //起点标记已访问
q.push(Point(x0, y0, z0, ));
while (!q.empty()){
Point tmp = q.front(); q.pop();
if (mapp[tmp.x][tmp.y][tmp.z] == 'E'){
//找到终点,搜索结束,输出最短路
printf("Escaped in %d minute(s).\n", tmp.step);
found = ;
break;
}
else{
Point tmp2;
++tmp.step; //步数必定增加 //往上一层
tmp2 = tmp;
tmp2.x = tmp.x - ;
if (judge(tmp2)){
visit[tmp2.x][tmp2.y][tmp2.z] = ;
q.push(tmp2);
} //往下一层
tmp2 = tmp;
tmp2.x = tmp.x + ;
if (judge(tmp2)){
visit[tmp2.x][tmp2.y][tmp2.z] = ;
q.push(tmp2);
} //以下四种为同一层 //往上一行
tmp2 = tmp;
tmp2.y = tmp.y - ;
if (judge(tmp2)){
visit[tmp2.x][tmp2.y][tmp2.z] = ;
q.push(tmp2);
} //往下一行
tmp2 = tmp;
tmp2.y = tmp.y + ;
if (judge(tmp2)){
visit[tmp2.x][tmp2.y][tmp2.z] = ;
q.push(tmp2);
} //往左一列
tmp2 = tmp;
tmp2.z = tmp.z - ;
if (judge(tmp2)){
visit[tmp2.x][tmp2.y][tmp2.z] = ;
q.push(tmp2);
} //往右一列
tmp2 = tmp;
tmp2.z = tmp.z + ;
if (judge(tmp2)){
visit[tmp2.x][tmp2.y][tmp2.z] = ;
q.push(tmp2);
} }//else
}//while
if (!found){
printf("Trapped!\n");
}
} int main()
{
#ifdef _LOCAL
freopen("D:\\input.txt", "r", stdin);
#endif int sx, sy, sz;
while (scanf("%d%d%d", &o, &n, &m) == && (m + n + o)){
memset(visit, , sizeof visit);
for (int i = ; i < o; ++i){
for (int j = ; j < n; ++j){
scanf("%s", mapp[i][j]);
for (int k = ; k < m; ++k){
if (mapp[i][j][k] == 'S'){
sx = i;
sy = j;
sz = k;
}
}//for(k)
}//for(j) n行
}//for(i) o层
bfs(sx, sy, sz); //sx是深度
} return ;
}

POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)的更多相关文章

  1. POJ 2251 Dungeon Master (三维BFS)

    题目链接:http://poj.org/problem?id=2251 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  2. POJ 2251 Dungeon Master(3D迷宫 bfs)

    传送门 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28416   Accepted: 11 ...

  3. POJ.2251 Dungeon Master (三维BFS)

    POJ.2251 Dungeon Master (三维BFS) 题意分析 你被困在一个3D地牢中且继续寻找最短路径逃生.地牢由立方体单位构成,立方体中不定会充满岩石.向上下前后左右移动一个单位需要一分 ...

  4. BFS POJ 2251 Dungeon Master

    题目传送门 /* BFS:这题很有意思,像是地下城,图是立体的,可以从上张图到下一张图的对应位置,那么也就是三维搜索,多了z坐标轴 */ #include <cstdio> #includ ...

  5. POJ 2251 Dungeon Master(地牢大师)

    p.MsoNormal { margin-bottom: 10.0000pt; font-family: Tahoma; font-size: 11.0000pt } h1 { margin-top: ...

  6. POJ 2251 Dungeon Master /UVA 532 Dungeon Master / ZOJ 1940 Dungeon Master(广度优先搜索)

    POJ 2251 Dungeon Master /UVA 532 Dungeon Master / ZOJ 1940 Dungeon Master(广度优先搜索) Description You ar ...

  7. poj 2251 Dungeon Master

    http://poj.org/problem?id=2251 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  8. POJ 2251 Dungeon Master (非三维bfs)

    Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 55224   Accepted: 20493 ...

  9. POJ 2251 Dungeon Master【三维BFS模板】

    Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45743 Accepted: 17256 Desc ...

随机推荐

  1. 图书馆管理系统SRS

    1.任务概述 1.1目标 主要提供图书信息和读者基本信息的维护以及借阅等功能.本系统是提高图书管理工作的效率,减少相关人员的工作量,使学校的图书管理工作真正做到科学.合理的规划,系统.高效的实施. 1 ...

  2. DotNetBar v12.9.0.0 Fully Cracked

    更新信息: http://www.devcomponents.com/customeronly/releasenotes.asp?p=dnbwf&v=12.9.0.0 如果遇到破解问题可以与我 ...

  3. 创建plist文件

    可以先在工程中直接新建一个plist文件,往里面写入自己需要的数据.但是这里的plist文件我们无法修改,是只读的,我们可以将这个plist文件复制一份到沙盒中,然后对沙盒中的文件进行操作.具体代码如 ...

  4. Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(三)

    最近写了个Matlab程序,好慢呐……所以开始学习Matlab与C/C++混合编程.下面写了个测试代码,显示一个Double类型矩阵中的元素. 源代码 #include "mex.h&quo ...

  5. Android中 服务里的方法抽取成接口

    1 写个类继承Service 重写 onBind方法 返回一个IBinder 对象(传递到连接成功时用) 2 服务中 写一个内部类 继承IBinder 并且实现一个接口(用于抽取方法)继承IBinde ...

  6. 嵌入dll到rtf文件

    嵌入文件到doc文件中, 打开word--->插入菜单---->对象--->新建---->对象类型----->Package---->弹出创建软件包界面-----& ...

  7. 从问题看本质:socket到底是什么(问答式)? .

    转自:http://blog.csdn.net/yeyuangen/article/details/6799575 一.问题的引入——socket的引入是为了解决不同计算机间进程间通信的问题 1.so ...

  8. Ubuntu 14.10 下安装中文输入法

    系统默认带的是IBUS,这个不怎么好用,我们需要安装一个新的框架FCITX 1 打开软件中心,输入fcitx,安装flexible input method framework 2 下载需要的输入法, ...

  9. (转)Position定位:relative | absolute

    原文:http://hi.baidu.com/zxc0420/item/9ada5110845ba1e89c778a08 Position定位:relative | absolute 定位一直是WEB ...

  10. linux基础命令学习(七)samba服务器配置

    samba有五种安全级别,它们分别是: share:不需要samba账户就可登陆samba服务器      user:需要添加samba账户才可以登陆samba服务器      server:由另外一 ...