题目大意:题目链接
给个多层的迷宫,求从起点到终点的最短路径,不能到达就输出Trapped!
解体思路:
bfs直接搜,没什么好说的,一开始忘记清空队列一只WA,果然我还是菜鸡
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct node{
int x,y,z;
}no;
queue<node> q;
int ans=0;
const int maxn = 35;
char mp[maxn][maxn][maxn];
int xx[6] = {-1,1,0,0,0,0};
int yy[6] = {0,0,-1,1,0,0};
int zz[6] = {0,0,0,0,-1,1};
bool vis[maxn][maxn][maxn];
int len[maxn][maxn][maxn];
int l,r,c;
int bx,by,bz;
int bfs(){
while(!q.empty()) q.pop();
memset(vis,false,sizeof(vis));
memset(len,0,sizeof(len));
no.x=bx;
no.y=by;
no.z=bz;
q.push(no);
len[no.x][no.y][no.z]=0;
while(!q.empty()){
node no1=q.front();
q.pop();
for(int i=0;i<6;i++){
int dx=no1.x+xx[i];
int dy=no1.y+yy[i];
int dz=no1.z+zz[i];
if(!vis[dx][dy][dz] && (mp[dx][dy][dz]=='.' || mp[dx][dy][dz]=='E')
&& dx>=0 && dx <l && dy >= 0 && dy< r && dz >=0 && dz < c)
{
vis[dx][dy][dz]=1;
len[dx][dy][dz]=len[no1.x][no1.y][no1.z]+1;
no.x=dx;
no.y=dy;
no.z=dz;
q.push(no);
if(mp[no.x][no.y][no.z]=='E')
{
return len[no.x][no.y][no.z];
}
}
}
}
return 0;
}
int main(int argc, char const *argv[])
{
//freopen("t.txt","r",stdin);
while(~scanf("%d%d%d",&l,&r,&c)){
if(l==0 && r==0 && c==0) break;
ans=0;
for(int x=0;x<l;x++){
for(int y=0;y<r;y++){
for(int z=0;z<c;z++){
cin>>mp[x][y][z];
if(mp[x][y][z]=='S'){
bx=x;by=y;bz=z;
}
}
}
}
int ans=bfs();
if(ans) printf("Escaped in %d minute(s).\n",ans);
else printf("Trapped!\n");
}
return 0;
}