[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!
思路:这个题目就是6个方向的BFS把 方向设定好,,找到起点找到终点,然后BFS吧
#include<iostream> #include<queue> #include<cstdio> #include<cstdio> #include<cstring> #define N 33 //int base[6][3] = { {-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1} }; using namespace std; int l,n,m; char arr[N][N][N]; int mark[N][N][N]; int sa,sb,sc; int ea,eb,ec; struct stu{ int a,b,c;//坐标 int s;//距离 }e1,e2,e3; int base[6][3] = { {-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1} };//6个方向 void BFS(){ memset(mark,0,sizeof(mark)); queue<stu >s; e1.a=sa,e1.b=sb,e1.c=sc; e1.s=0; s.push(e1); mark[sa][sb][sc]=1; int ans=-1; while(s.size()){ e2=s.front(); s.pop(); if(e2.a==ea && e2.b==eb && e2.c==ec)//判断是否到达了终点 { ans=e2.s; break; } for(int i=0;i<6;i++){ e3.a=e2.a+base[i][0]; e3.b=e2.b+base[i][1]; e3.c=e2.c+base[i][2]; if((e3.a>= 0) && (e3.a < l) && (e3.b >= 0) && (e3.b < n) && (e3.c >= 0) && (e3.c < m) && (!mark[e3.a][e3.b][e3.c]) && (arr[e3.a][e3.b][e3.c] == '.' || arr[e3.a][e3.b][e3.c] == 'E')) { e3.s=e2.s+1; mark[e3.a][e3.b][e3.c]=1; s.push(e3); } } } if(ans==-1){ cout<<"Trapped!"<<endl; } else { printf("Escaped in %d minute(s). ",ans); } } int main() { while(cin>>l>>n>>m){ if(n==0&&m==0&&l==0) break; for(int i=0;i<l;i++){ for(int j=0;j<n;j++){ scanf("%s",&arr[i][j]); } } for(int i=0;i<l;i++){ for(int j=0;j<n;j++){ for(int k=0;k<m;k++){ if(arr[i][j][k]=='S') { sa=i; sb=j; sc=k; } else if(arr[i][j][k]=='E'){ ea=i; eb=j; ec=k; } } } } BFS(); } return 0; }