POJ 2251 三维广搜。

B - Dungeon Master

Crawling in process...
Crawling failed
Time Limit:1000MS    
Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Submit
Status

Description

You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled with rock. It takes one minute to move one unit north, south, east, west, up or down. You
cannot move diagonally and the maze is surrounded by solid rock on all sides.

Is an escape possible? If yes, how long will it take?

Input

The input consists of a number of dungeons. Each dungeon description starts with a line containing three integers L, R and C (all limited to 30 in size).

L is the number of levels making up the dungeon.

R and C are the number of rows and columns making up the plan of each level.

Then there will follow L blocks of R lines each containing C characters. Each character describes one cell of the dungeon. A cell full of rock is indicated by a ‘#‘ and empty cells are represented by a ‘.‘. Your starting position is indicated by ‘S‘ and the
exit by the letter ‘E‘. There‘s a single blank line after each level. Input is terminated by three zeroes for L, R and C.

Output

Each maze generates one line of output. If it is possible to reach the exit, print a line of the form

Escaped in x minute(s).

where x is replaced by the shortest time it takes to escape.

If it is not possible to escape, print the line

Trapped!

Sample Input

3 4 5
S....
.###.
.##..
###.#

#####
#####
##.##
##...

#####
#####
#.###
####E

1 3 3
S##
#E#
###

0 0 0

Sample Output

Escaped in 11 minute(s).
Trapped!

作为一个弱菜,被这道题卡了一天了。

三维广搜,六个方向,上下左右前后。

第一个案例可以理解为三个三层叠在一起的。

#include <stdio.h>
#include <string.h>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
#define M 45
#define inf 0x6ffffff
char map[M][M][M];
int vis[M][M][M];
int dir[6][3]={{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}};//六个方向
int n,m,ok,k;
struct node
{
	int x,y,z;
	int time;
}
;
node f[666];
int ztime;
int z2,x2,y2,z1,x1,y1;
void bfs()
{
	int i;
	queue<node>q;
	node st,ed;
	st.x=x1;
	st.y=y1;
    st.z=z1;
	st.time=0;
	q.push(st);
	while(!q.empty())
	{
		st=q.front();
		q.pop();
		if(st.x==x2 &&st.y==y2 &&st.z==z2)
		{
			ok=1;
			ztime=st.time;
			return;
		}
		for(i=0;i<6;i++)
		{
			ed.x=st.x+dir[i][0];
			ed.y=st.y+dir[i][1];
			ed.z=st.z+dir[i][2];
			if(map[ed.x][ed.y][ed.z]=='#' ||vis[ed.x][ed.y][ed.z] ||ed.x<0 ||ed.x>=k ||ed.y<0 ||ed.y>=n ||ed.z<0||ed.z>=m)//越界,搜过的地方,墙全部排除
				continue;
			ed.time=st.time+1;  //时间加一
			vis[ed.x][ed.y][ed.z]=1;
			q.push(ed);
		}
	}
	return;
}
int main()
{
	int i,j,r;
	while(scanf("%d%d%d",&k,&n,&m)!=EOF &&k!=0 &&n!=0 &&m!=0)
	{
		ok=0;
		memset(vis,0,sizeof(vis));
		for(i=0;i<k;i++)
			for(j=0;j<n;j++)  //我把j++写成i++找了一天的错误。。无语。
			{
				scanf("%s",map[i][j]);//输入地图
				for(r=0;r<m;r++)
				{
					if(map[i][j][r]=='S')
					{
						z1=r;
						x1=i;
						y1=j;
					}
					else if(map[i][j][r]=='E')
					{
						z2=r;
						x2=i;
						y2=j;
					}
				}
			}
			vis[x1][y1][z1]=1;
			bfs();
			//	printf("%d\n",ok);
			if(!ok)
				printf("Trapped!\n"); //后面有!。这里WA了一次。
			else
				printf("Escaped in %d minute(s).\n",ztime);//改了上面之后,这里后面有个点,又WA了一次。 ORZ。
	}
	return 0;
}
时间: 2024-10-14 17:06:30

POJ 2251 三维广搜。的相关文章

HDU 1253 (简单三维广搜) 胜利大逃亡

奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz 而且我也优化过了的啊,尼玛还是一直爆! 先把代码贴上睡觉去了,明天再来弄 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <cmath> 7 using namespace std; 8 9 struct Poin

HDU 1240 (简单三维广搜) Asteroids!

给出一个三维的迷宫以及起点和终点,求能否到大终点,若果能输出最短步数 三维的问题无非就是变成了6个搜索方向 最后强调一下xyz的顺序,从输入数据来看,读入的顺序是map[z][x][y] 总之,这是很基础的一道题 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <algorithm

poj 2251 Dungeon Master(简单三维广搜)

题意: 之前做过的所有题都是   在一个平面   上搜索 . 本题很新,在一个三维空间里 ,首先   l  x  y   分别代表 l 层   每一层有 x 行   y 列 问从 S 开始   走到 E   最小步是多少    显然用广搜,只是多了一个向上向下的搜索. 注意: 所谓广搜  ,是一层一层的搜,  每一层其步数是一样的   ,可以通过建立一个数组存步数 ,也可以 将步数同时存入队列中 另外搜过的要做标记, 在做标记时  尽量要在里面做标记(就是每搜过一个点就  立马 将之标记)不然一

poj 2251 三维地图bfs

三维地图 poj 2251 #include<iostream> #include<queue> #include<cstdio> #include<cstring> using namespace std; char map[35][35][35]; int l,r,c; bool book[35][35][35]; // 定义 东西南北和上下 struct dis{ int x,y,z; int step; dis(int x,int y,int z,i

zoj1940(三维广搜)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=940 分析:三维其实就是六个方向地搜索,思维清晰且细心点,很快就AC了. #include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #incl

poj 2251(广搜求两点之间的距离)

题目链接:http://poj.org/problem?id=2251 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16682   Accepted: 6491 Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit

poj 1166 The Clocks 记录路径的广搜

题意: 给9个时钟的初始状态,和一些对某几个钟的操作,求最少经过几步能到目标状态(全指向12点). 分析: 明显的广搜,但实现起来的细节要注意:1.因为要记录路径,所以要在整个程序执行过程中扩展出的节点在输出路径前不能销毁, 故采用静态内存分配的方法(开node[600000],用get_node()创建节点.2.queue<node>比queue<int>要多花1别的时间. //poj 1166 //sep9 #include <iostream> #include

双向广搜 POJ 3126 Prime Path

POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted: 9153 Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change th

POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层的地图,相同RC坐标处是相连通的.(.可走,#为墙) 解题思路:从起点开始分别往6个方向进行BFS(即入队),并记录步数,直至队为空.若一直找不到,则困住. /* POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路) */ #include <cstdio> #i