学习点:

scanf可以自动过滤空行

搜索时要先判断是否越界(L R C),再判断其他条件是否满足

bfs搜索时可以在入口处(push时)判断是否达到目标,也可以在出口处(pop时)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<queue>
using namespace std;
const int N=31;
const int dl[]={-1, 1, 0, 0, 0, 0};
const int dr[]={0, 0, -1, 1, 0, 0};
const int dc[]={0, 0, 0, 0, -1, 1};struct State {State(int l, int r, int c, int d): l(l), r(r), c(c), d(d) {}int l, r, c;int d;
};int L, R, C;
int SL, SR, SC;
int EL, ER, EC;
typedef char A[N][N][N];
A dungeon, vis;int bfs() {if(SL==EL && SR==EL && SC==EC) return 0;State s(SL, SR, SC, 0); vis[SL][SR][SC]=1;queue<State> q;q.push(s);while(!q.empty()) {State t=q.front(); q.pop();//可以在出口判断//if(t.l==EL && t.r==ER && t.c==EC) return t.d;for(int i=0;i<6;i++) {int nl=t.l+dl[i];int nr=t.r+dr[i];int nc=t.c+dc[i];if(nl>=0 && nl<L && nr>=0 && nr<R && nc>=0 && nc<C && !vis[nl][nr][nc] && dungeon[nl][nr][nc]!='#') {//也可以在入口判断if(nl==EL && nr==ER && nc==EC) return t.d+1;q.push(State(nl, nr, nc, t.d+1));vis[nl][nr][nc]=1;}}}return -1;
}int main() {
#ifndef ONLINE_JUDGEfreopen("./uva532.in", "r", stdin);
#endifwhile(scanf("%d%d%d", &L, &R, &C)==3 && L && R && C) {for(int i=0;i<L;i++) {for(int j=0;j<R;j++) {scanf("%s", dungeon[i][j]);for(int k=0;k<C;k++)if(dungeon[i][j][k]=='S') SL=i, SR=j, SC=k;else if(dungeon[i][j][k]=='E') EL=i, ER=j, EC=k;}}memset(vis, 0, sizeof vis);int ans=bfs();if(ans==-1)printf("Trapped!\n");elseprintf("Escaped in %d minute(s).\n", ans);}return 0;
}

// UVa532 Dungeon Master
// Rujia Liu
// 题意:三维迷宫中给定起点(字符S)和终点(字符E),墙是'#',空格是'.',求最短路长度
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;struct State {int l, r, c;State(int l, int r, int c):l(l),r(r),c(c) {}
};const int maxn = 30 + 5;
const int dl[] = {1,-1,0,0,0,0};
const int dr[] = {0,0,1,-1,0,0};
const int dc[] = {0,0,0,0,1,-1};
int L, R, C, d[maxn][maxn][maxn], vis[maxn][maxn][maxn];
char maze[maxn][maxn][maxn];int bfs(int l1, int r1, int c1) {queue<State> Q;d[l1][r1][c1] = 0;vis[l1][r1][c1] = 1;Q.push(State(l1, r1, c1));while(!Q.empty()) {State s = Q.front(); Q.pop();for(int i = 0; i < 6; i++) {int newl = s.l + dl[i];int newr = s.r + dr[i];int newc = s.c + dc[i];if(newl >= 0 && newl < L && newr >= 0 && newr < R && newc >= 0 && newc < C && maze[newl][newr][newc] != '#' && !vis[newl][newr][newc]) {Q.push(State(newl, newr, newc));vis[newl][newr][newc] = 1;d[newl][newr][newc] = d[s.l][s.r][s.c] + 1;if(maze[newl][newr][newc] == 'E') return d[newl][newr][newc];}}}return -1;
}int main() {while(scanf("%d%d%d", &L, &R, &C) == 3 && L) {int l1, r1, c1;for(int i = 0; i < L; i++)for(int j = 0; j < R; j++) {scanf("%s", maze[i][j]);for(int k = 0; k < C; k++)if(maze[i][j][k] == 'S') { l1 = i; r1 = j; c1 = k; }}memset(vis, 0, sizeof(vis));int ans = bfs(l1, r1, c1);if(ans >= 0) printf("Escaped in %d minute(s).\n", ans);else printf("Trapped!\n");}return 0;
}

UVa532 Dungeon Master 三维迷宫相关推荐

  1. UVA532 Dungeon Master

    问题链接:UVA532 Dungeon Master. 题意简述:三维空间地牢(迷宫),每个点由'.'(可以经过).'#'(墙).'S'(起点)和'E'(终点)组成.移动方向有上.下.左.右.前和后6 ...

  2. Dungeon Master 三维BFS

    三维BFS DungeonMasterDungeon\ MasterDungeon Master 跟二维没啥区别,就是方向多了几个,但在写的过程中出的bugbugbug还是蛮多的,所以记录一下吧! # ...

  3. poj 2251 Dungeon Master (三维bfs)

    http://poj.org/problem?id=2251 简单bfs,只不过是三维的... 唯一的坑点在输出上... Escaped in %d minute(s) 这意思是答案为1输出minut ...

  4. UVA532 - Dungeon Master(裸BFS)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. 【POJ2251】Dungeon Master(三维BFS)

    题面:[POJ2251]Dungeon Master 这是一道很有意思的题目,平时我们所接触的BFS大多是二维的,可这题不一样,这题是一道三维BFS!!! 这题不需要多讲,直接上代码就可以了: #in ...

  6. POJ 2251 Dungeon Master(三维BFS求最短路径)

    3D dungeon 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 [提交][状态][讨论版][命题人:201506020829][Edit] [TestData] 题 ...

  7. Dungeon Master(地牢大师、底下城主)三维bfs

    1253:Dungeon Master(地牢大师.底下城主) 要敢于变通 和普通bfs的区别,仅仅在于数组开三维+搜索方向多了上下(现在的搜索方向是 上下东南西北) bfs多组输入要记得清空队列 // ...

  8. 信息学奥赛一本通(1248:Dungeon Master)

    1248:Dungeon Master 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 8637     通过数: 3432 [题目描述] 这题是一个三维的迷宫题目 ...

  9. Dungeon Master 地下城大师(BFS进阶)

    题目链接:2251 -- Dungeon Master 知道你看不懂题(手动滑稽):友情链接. 题意:找到从S到E的最少步数的路径,输出该步数,不过有意思的是这个类似迷宫问题不是二维的,是一个三维迷宫 ...

  10. Dungeon Master题解bfs

    Dungeon Master 题面翻译 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 题解思路及TIME EXCEEDED问题 题解 超时题解(个人觉得没问题) 题面翻译 ...

最新文章

  1. php文件保存类库,PHP生成PDF文件类库大全[开源]
  2. 20140923 cin.get() getline cin
  3. Java中泛型Class T, T与Class ?
  4. 前端优化系列之浏览器渲染
  5. 用canvas实现手写签名功能
  6. 2020跨境电商独立站将喷发式增长?
  7. χ² 分布到 F 分布到 ANOVA
  8. 岑溪高考成绩查询2021,2019岑溪高考成绩喜报(归义中学、筋竹中学、南
  9. Python实现最简单的深度学习任意层神经网络算法,通熟易懂,里面包括了详细注释的源码
  10. windows 弹shell_一步步学写Windows下的Shellcode
  11. Scratch3.0(一)初识Scratch3.0
  12. 《功夫熊猫》的人生启示
  13. 票务网 php,电影票务网站的设计与制作
  14. [转] 数学原理浅谈一下《黑客帝国》
  15. 住房教育当从娃娃抓起
  16. linux hosts文件的修改------利用root权限来vim /etc/hosts
  17. 方便学生会议记录,讯飞智能录音笔SR101值得选择
  18. 关于安全产品和安全服务
  19. martin fowler_Martin Kleppmann的大型访谈:“弄清楚分布式数据系统的未来”
  20. linphone - Network is unreachable (真的时网络不可达)

热门文章

  1. Oracle 11g 服务名称以及作用
  2. 取得系统当前日期和时间
  3. Query with 0 value even no record found
  4. WebService之基于REST机制的实现实例(Java版)
  5. Python 对象的绑定方法
  6. 信息安全系统设计基础实验二:固件设计
  7. Object-C——三大特性之多态
  8. [ZT]软件质量属性
  9. MySQL:Innodb表 Data free 的计算概要
  10. SAP 生产订单变更管理 OCM Order Changement Management