1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include<iostream> #include<map> #include<vector> #include<map> #include<set> #include<list> #include<climits> #include<algorithm> #include<cmath> #include<climits> #include<queue> #include<cstdio> #include<cstring> #include<stack> using namespace std; const int maxn=30; string mp[maxn][maxn]; int vis[maxn][maxn][maxn]; int dir[6][3]={{0,-1,0},{0,1,0},{0,0,-1},{0,0,1},{1,0,0},{-1,0,0}}; int L,R,C,Sl,Sr,Sc,Tl,Tr,Tc; int ans=INT_MAX; struct Node{ int l,r,c,cnt; }; bool is_ok(int l,int r,int c){ return (l>=0&&l<L&&r>=0&&r<R&&c>=0&&c<C&&(mp[l][r][c]=='E'||mp[l][r][c]=='.')&&!vis[l][r][c]); } void bfs(int l,int r,int c,int cnt){ queue<Node>qu; qu.push({l,r,c,cnt}); while(!qu.empty()){ Node node=qu.front(); qu.pop(); l= node.l;r=node.r;c=node.c;cnt=node.cnt; for(int i=0;i<6;i++){ int next_l=l+dir[i][0]; int next_r=r+dir[i][1]; int next_c=c+dir[i][2]; if(is_ok(next_l,next_r,next_c)){ vis[next_l][next_r][next_c]=1; qu.push({next_l,next_r,next_c,cnt+1}); if(next_l==Tl&&next_r==Tr&&next_c==Tc){ ans=cnt+1; return ; } } } }
return ; } int main(){ ios::sync_with_stdio(0),cin.tie(0); while(cin>>L>>R>>C&&L&&R&&C){ memset(vis,0,sizeof vis); ans=INT_MAX; for(int i=0;i<L;i++){ for(int j=0;j<R;j++){ cin>>mp[i][j]; for(int k=0;k<C;k++){ if(mp[i][j][k]=='S'){ Sl=i;Sr=j;Sc=k; }else if(mp[i][j][k]=='E'){ Tl=i;Tr=j;Tc=k; } } } } vis[Sl][Sr][Sc]=1; bfs(Sl,Sr,Sc,0); if(ans==INT_MAX){ cout<<"Trapped!\n"; }else{ cout<<"Escaped in "<<ans<<" minute(s).\n"; } }
return 0; }
|