UVa532 Dungeon Master 三维迷宫
学习点:
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_JUDGE
freopen("./uva532.in", "r", stdin);
#endif
while(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");
else
printf("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 三维迷宫的更多相关文章
- POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)
POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...
- POJ 2251 Dungeon Master (三维BFS)
题目链接:http://poj.org/problem?id=2251 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total S ...
- 【一本通1248:Dungeon Master&&洛谷UVA532 Dungeon Master】
若不会广搜转向[广搜] [题目描述] 这题是一个三维的迷宫题目,其中用‘.’表示空地,‘#’表示障碍物,‘S’表示起点,‘E’表示终点,求从起点到终点的最小移动次数,解法和二维的类似,只是在行动时除了 ...
- POJ:Dungeon Master(三维bfs模板题)
Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16748 Accepted: 6522 D ...
- ZOJ 1940 Dungeon Master 三维BFS
Dungeon Master Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Desc ...
- Dungeon Master(三维bfs)
You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...
- POJ 2252 Dungeon Master 三维水bfs
题目: http://poj.org/problem?id=2251 #include <stdio.h> #include <string.h> #include <q ...
- POJ 2251 Dungeon Master (非三维bfs)
Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 55224 Accepted: 20493 ...
- POJ.2251 Dungeon Master (三维BFS)
POJ.2251 Dungeon Master (三维BFS) 题意分析 你被困在一个3D地牢中且继续寻找最短路径逃生.地牢由立方体单位构成,立方体中不定会充满岩石.向上下前后左右移动一个单位需要一分 ...
随机推荐
- uestc 1722 吴神的表白
// 这题做的我好难过 不是因为没有思路 而是因为超数据类型范围的事// ax+by=c a,b,c>0// 那么该直线经过 1 2 4三个象限// 2 4 象限的第一整数解肯定是该象限最优解/ ...
- Oracle IO优化心得
很多的时侯,做Oracle DBA的我们,当应用管理员向我们通告现在应用很慢.数据库很慢的时侯,我们到数据库时做几个示例的Select也发现同样的问题时,有些时侯我们会无从下手,因为我们认为数据库的各 ...
- Android 工程目录结构简介
一般来说,一个Android工程的目录结构如下图所示. 1:src JAVA源代码都放在这里面. 2:gen 编译器自动生成的一些JAVA代码 3:Android 4.2 Android平台(本工程用 ...
- UITextField限制字数的方法
转:http://blog.csdn.net/marujunyy/article/details/9985411 在输入东西的时候,如果想限制最大字数,可以用下面方法: - (BOOL)textFie ...
- html input readonly 和 disable的区别
Readonly和Disabled它们都能够做到使用户不能够更改表单域中的内容.但是它们之间有着微小的差别,总结如下: Readonly只针对input(text / password)和textar ...
- Android Scrollview 内部组件android:layout_height="fill_parent"无效的解决办法
Found the solution myself in the end. The problem was not with the LinearLayout, but with the Scrol ...
- visio 改变画布大小
按住键盘Ctrl键,将鼠标箭头移动到画布边界处就可以自由拖动画布大小了.
- 【转载】【内存对齐(二)】__declspec( align(#) )的用法和大小计算
转自:http://www.cppblog.com/deercoder/archive/2011/03/13/141747.html 感谢作者! 在上面讲到了关于pack的内存对齐和计算方法,这里继续 ...
- C++实现网格水印之调试笔记(五)—— 提取出错
在实现提取水印的过程中,遇到了一些问题 首先还是根据论文中的思路来梳理一下整个提取流程 读入两个模型,一个原始模型ori_mesh, 一个水印模型wm_mesh. 将两个模型对齐(即放在同一个坐标系下 ...
- iOS开发相关图书推荐
Objective-C编程之道:iOS设计模式解析 作 者 [美] Carlo Chung 著:刘威 译 出 版 社 人民邮电出版社 出版时间 2011-11-01 版 次 1 页 ...