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
*/