POJ 2251 Dungeon Master 【BFS+剪枝+优先队列】

思路:这是一个三维迷宫问题,用六个方向数组搞定的,注意剪枝!代码如下:

#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
char map[30][30][30];
//int vis[30][30][30];
int L,R,C;
struct node{
	int x;
	int y;
	int z;
	int t;
	bool friend operator < (node a,node b)
	{
	  return a.t > b.t;
    }
};
int dis[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
void BFS(int x,int y,int z,int x1,int y1,int z1){
	int vis[30][30][30]={0};
	priority_queue<node>que;
	node e1,e2;
	e1.x=x,e1.y=y,e1.z=z,e1.t=0;
	que.push(e1);
	vis[e1.x][e1.y][e1.z]=1;
	int ans=-1;
	while(!que.empty()){
		e1=que.top();
		que.pop();
		if(e1.x==x1&&e1.y==y1&&e1.z==z1){
			ans=e1.t;
			break;
		}
		for(int i=0;i<6;i++){
			e2.x=e1.x+dis[i][0];
			e2.y=e1.y+dis[i][1];
			e2.z=e1.z+dis[i][2];
			if(map[e2.x][e2.y][e2.z]!='#' && 0<=e2.x && e2.x<L && 0<=e2.y && e2.y<R && 0<=e2.z && e2.z<C&&!vis[e2.x][e2.y][e2.z])
			{
				
				e2.t=e1.t+1;
				que.push(e2);
				vis[e2.x][e2.y][e2.z]=1;
			}

		}
	}
	if(ans==-1)
	   cout<<"Trapped!"<<endl;
	else
	   printf("Escaped in %d minute(s).\n",ans); 
}
int main()
{
	int x1,x2,y1,y2,z1,z2;
	while(cin>>L>>R>>C&&L&&R&&C){
		for(int i=0;i<L;i++){
			for(int j=0;j<R;j++){
				for(int p=0;p<C;p++){
					cin>>map[i][j][p];
					if(map[i][j][p]=='S')
					{
						x1=i;
						y1=j;
						z1=p;
 
					}
					if(map[i][j][p]=='E')
					{
						x2=i;
						y2=j;
						z2=p;
					}
				}
			}
		}
		BFS(x1,y1,z1,x2,y2,z2);
	}
	return 0;
}

ps:风景虽美,记忆残存!

Description - 题目描述

[NWUACM] 
你被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成
你每次向上下前后左右移动一个单位需要一分钟
你不能对角线移动并且四周封闭
是否存在逃出生天的可能性?如果存在,则需要多少时间?

Input - 输入

  输入第一行是一个数表示空间的数量。
  每个空间的描述的第一行为L,R和C(皆不超过30)。
  L表示空间的高度。
  R和C分别表示每层空间的行与列的大小。
  随后L层地牢,每层R行,每行C个字符。
  每个字符表示空间的一个单元。'#'表示不可通过单元,'.'表示空白单元。你的起始位置在'S',出口为'E'。
  每层空间后都有一个空行。L,R和C均为0时输入结束。

Output - 输出

  每个空间对应一行输出。

  如果可以逃生,则输出如下

Escaped in x minute(s).

  x为最短脱离时间。



  如果无法逃生,则输出如下

Trapped!

Sample Input - 输入样例

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

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

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

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

0 0 0

Sample Output - 输出样例

Escaped in 11 minute(s).
Trapped!

猜你喜欢

转载自blog.csdn.net/LOOKQAQ/article/details/81348964