题目描述:
zjm被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成。
zjm每次向上下前后左右移动一个单位需要一分钟,且zjm不能对角线移动。
空间的四周封闭。zjm的目标是走到空间的出口。
是否存在逃出生天的可能性?如果存在,则需要多少时间?
思路:
因为要求的是最短时间,所以在三维数组上跑BFS即可
不能对角线移动,所以在一个点只有上下左右前后六种移动方案
代码:
#include <cstdio> #include <iostream> #include <cstring> #include <queue> using namespace std; int dx[]={0,0,0,-1,0,1,0}; int dy[]={0,0,0,0,1,0,-1}; int dz[]={0,1,-1,0,0,0,0}; //6 directions : up down front right back left int Z,X,Y; int G[35][35][35],vis[35][35][35]; int Sx,Sy,Sz; int Tx,Ty,Tz; struct Point { int x,y,z; int dep; }; int bfs() { queue<Point> q; q.push({Sx,Sy,Sz,0}); vis[Sx][Sy][Sz]=1; while(!q.empty()) { Point now=q.front(); q.pop(); if(now.x==Tx&&now.y==Ty&&now.z==Tz) return now.dep; for(int i=1;i<=6;i++) { int nx=dx[i]+now.x,ny=dy[i]+now.y,nz=dz[i]+now.z; if(nx>=1&&nx<=X&&ny>=1&&ny<=Y&&nz>=1&&nz<=Z&&G[nx][ny][nz]==0 &&vis[nx][ny][nz]==0) { q.push({nx,ny,nz,now.dep+1}); vis[nx][ny][nz]=1; } } } return -1; } int main() { while(scanf("%d %d %d",&Z,&X,&Y) ==3 && !(X==0&&Y==0&&Z==0)) { memset(G,0,sizeof(G)); memset(vis,0,sizeof(vis)); for(int k=1;k<=Z;k++) for(int i=1;i<=X;i++) { string s; cin>>s; for(int j=0,n=s.size();j<n;j++) { if(s[j]=='S') Sx=i,Sy=j+1,Sz=k; else if(s[j]=='#') G[i][j+1][k]=1; else if(s[j]=='E') Tx=i,Ty=j+1,Tz=k; } } int ans=bfs(); if(ans==-1) cout<<"Trapped!"<<endl; else printf("Escaped in %d minute(s). ",ans); } return 0; }