POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)
题目大意: 给出一三维空间的地牢,要求求出由字符'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求最短路)的更多相关文章
- POJ 2251 Dungeon Master (三维BFS)
题目链接:http://poj.org/problem?id=2251 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total S ...
- POJ 2251 Dungeon Master(3D迷宫 bfs)
传送门 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28416 Accepted: 11 ...
- POJ.2251 Dungeon Master (三维BFS)
POJ.2251 Dungeon Master (三维BFS) 题意分析 你被困在一个3D地牢中且继续寻找最短路径逃生.地牢由立方体单位构成,立方体中不定会充满岩石.向上下前后左右移动一个单位需要一分 ...
- BFS POJ 2251 Dungeon Master
题目传送门 /* BFS:这题很有意思,像是地下城,图是立体的,可以从上张图到下一张图的对应位置,那么也就是三维搜索,多了z坐标轴 */ #include <cstdio> #includ ...
- POJ 2251 Dungeon Master(地牢大师)
p.MsoNormal { margin-bottom: 10.0000pt; font-family: Tahoma; font-size: 11.0000pt } h1 { margin-top: ...
- 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 ...
- poj 2251 Dungeon Master
http://poj.org/problem?id=2251 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- POJ 2251 Dungeon Master (非三维bfs)
Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 55224 Accepted: 20493 ...
- POJ 2251 Dungeon Master【三维BFS模板】
Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45743 Accepted: 17256 Desc ...
随机推荐
- SQL中 char、varchar、text 和 nchar、nvarchar、ntext的区别
1.char.char存储定长数据很方便,char字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间. 2.va ...
- java,android获取系统当前时间
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss ");Date curDate = ...
- CDH上执行WordCount的意外和收获
前面将Cloudera Manager安装到集群上的一台主机后,并通过Cloudera manager安装了hadoop-2.6.0-CDH5.4.4.今日来测试安装的集群是否很够很好的执行mapre ...
- iOS数据存取和对象序列化
一. 使用NSKeyedArchiver类操作对象的存取 特点:该类可以将对象以键值对的形式存入文件,并通过key从文件中取出,与android中的SharedPreference用法类似,而且它序列 ...
- rcc
一.在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. 全名: high speed external ①HSI是高速内部时钟,RC振荡器,频率为8MHz. ②HSE是高 ...
- python 中的json解析库
当一个json 数据很大的时候.load起来是很耗时的.python中常见的json解析库有cjson,simplesjson,json, 初步比较了一下, 对于loads来讲 simplejson ...
- hadoop中Text类 与 java中String类的区别
hadoop 中 的Text类与java中的String类感觉上用法是相似的,但两者在编码格式和访问方式上还是有些差别的,要说明这个问题,首先得了解几个概念: 字符集: 是一个系统支持的所有抽象字符的 ...
- 2016 - 1- 19 GCD单例模式
一:单例模式的作用: 1.可以保证在程序运行过程中,一个类只有一个实例,而且易于外界访问.2 2.从而方便的控制了实例的个数,节约系统资源. 二:单例模式的应用场景: 代码: 1.在一个需要实现单例模 ...
- Maven Build profiles
They modify the POM at build time, and are meant to be used in complementary sets to give equivalent ...
- Codeforces Round #365 (Div. 2)-D Mishka and Interesting sum(树状数组)
题目链接:http://codeforces.com/contest/703/problem/D 思路:看了神犇的代码写的... 偶数个相同的数异或结果为0,所以区间ans[l , r]=区间[l , ...