D - Dungeon Master【BFS】

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!

三维数组bfs,题目本身不难套模板即可,但是一定要注意在输入时是按照z x y 的顺序,在用的时候别用成x y z...这个bug找了好久。。。

code:

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int h,n,m;
int ans;
char ma[35][35][35];
bool vis[35][35][35];
struct node{
	int x,y,z;
	int sum;
};
int dx[6]={1,-1,0,0,0,0};
int dy[6]={0,0,1,-1,0,0};
int dz[6]={0,0,0,0,1,-1};
void bfs(int sx,int sy,int sz)
{
//	cout<<"chuan"<<endl;
//	cout<<sx<<' '<<sy<<' '<<sz<<endl;
	memset(vis,0,sizeof(vis));
	ans=-1;
	queue<node>q;
	node u,v;
	u.x=sx;u.y=sy;u.z=sz;
	u.sum=0;
	q.push(u);
	vis[sz][sx][sy]=1;
	while(!q.empty()){
		u=q.front();
		q.pop();
		if(ma[u.z][u.x][u.y]=='E'){//z x y
			ans=u.sum;
			break;
		}
		for(int i=0;i<6;i++){
			v.x=u.x+dx[i];
			v.y=u.y+dy[i];
			v.z=u.z+dz[i];
			if(v.x>=0&&v.x<n&&v.y>=0&&v.y<m&&v.z>=0&&v.z<h&&vis[v.z][v.x][v.y]==0&&ma[v.z][v.x][v.y]!='#'){
				vis[v.z][v.x][v.y]=1;
				v.sum=u.sum+1;
				q.push(v);
			}
		}
	}
	if(ans!=-1){
			cout<<"Escaped in "<<ans<<" minute(s)."<<endl;
		}
	else
		cout<<"Trapped!"<<endl;
}
int main()
{
	while(cin>>h>>n>>m,h||n||m){
		for(int i=0;i<h;i++){
			for(int j=0;j<n;j++)
			cin>>ma[i][j];//z x y
		}
		for(int i=0;i<h;i++){
			for(int j=0;j<n;j++){
				for(int k=0;k<m;k++){
					if(ma[i][j][k]=='S'){
//						cout<<"zhao"<<endl;
//						cout<<j<<' '<<k<<' '<<i<<endl;
						bfs(j,k,i);
						break;
					}
				}
			}
		}
	}
	return 0;
}

/*
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
for(int i=0;i<4;i++){
fx = x + dx[i];
fy = y + dy[i];


1 -1  0   0  0  0
0  0  0   0  1 -1 
0  0  1  -1  0  0

 1  0
-1  0
 0  1
 0 -1
*/

猜你喜欢

转载自blog.csdn.net/qq_41333844/article/details/81352438