参考资料 yxc’s solution
这个题和ACWing 1101 有着极为相似的解法(简直就是一毛一样) 只是建的地图不一样 思路是一样的。
首先 得用一个三位数组存下地图 然后bfs遍历
- 层与层之间 的游走 只是在方向变量上增加了两个参数[emmmAQA]
- 然后从入口走到出口 正常遍历就是了。
如有疏漏 还请大家指正
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 110;
char g[N][N][N];
int res[N][N][N];
int layer,r,c;
struct pt{
int z,x,y;
}q[N*N*N];
int dx[]={0,0,1,-1,0,0};
int dy[]={1,-1,0,0,0,0};
int dz[]={0,0,0,0,1,-1};
int bfs(pt start,pt end)
{
int hh = 0,tt=0;
q[0]=start;
memset(res,-1,sizeof res);
res[start.z][start.x][start.y]=0;
while(hh<=tt){
auto t = q[hh++];
// res[t.z][t.x][t.y]++;
for(int i=0;i<6;i++){
int x,y,z;
x = t.x+dx[i];
y = t.y+dy[i];
z = t.z+dz[i];
if(x<0||y<0||z<0||x>=r||y>=c||z>=layer)
continue;
if(res[z][x][y]>-1||g[z][x][y]=='#')
continue;
res[z][x][y]=res[t.z][t.x][t.y]+1;
if(x==end.x&&y==end.y&&z==end.z) return res[z][x][y];
q[++tt]={z,x,y};
}
}
return -1;
}
int main()
{
while(cin>>layer>>r>>c,layer!=0&&r!=0&&c!=0){
pt st,end;
for(int i=0;i<layer;i++)
{
for(int j=0;j<r;j++)
{
scanf("%s",g[i][j]);
for(int k=0;k<c;k++)
{
if(g[i][j][k]=='S') st={i,j,k};
if(g[i][j][k]=='E') end={i,j,k};
}
}
}
int ans = bfs(st,end);
// for(int i=0;i<layer;i++)
// {
// for(int j=0;j<r;j++)
// {
// // scanf("%s",g[i][j]);
// for(int k=0;k<c;k++)
// {
// // if(g[i][j][k]=='S') st={i,j,k};
// // if(g[i][j][k]=='E') end={i,j,k};
// cout<<res[i][j][k]<<" ";
// }
// puts("");
// }
// puts("");
// }
if(ans==-1){
printf("Trapped!\n");
}else{
printf("Escaped in %d minute(s).\n",ans);
}
}
}