这道典型的广搜题,唯一要注意的就是严格按照输出格式来,而不是1不用输出加s,大于一要加s.
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
int dir[][3]={{1,0,0},{0,1,0},{-1,0,0},{0,-1,0},{0,0,1},{0,0,-1}};
int l,r,c;
struct point
{
int x;
int y;
int z;
int step;
};
char a[32][32][32];
int vis[32][32][32];
int sx,sy,sz,ex,ey,ez;
queue<point> q;
int bfs(int x,int y,int z)
{
point tmp,hd;
while(!q.empty())
q.pop();
tmp.x=x;
tmp.y=y;
tmp.z=z;
tmp.step=0;
vis[x][y][z]=1;
int i,j;
q.push(tmp);
int xx,yy,zz;
while(!q.empty())
{
hd=q.front();
q.pop();
for(i=0;i<6;i++)
{
xx=dir[i][0]+hd.x;
yy=dir[i][1]+hd.y;
zz=dir[i][2]+hd.z;
if(xx<0||yy<0||zz<0||xx>=l||yy>=r||zz>=c||a[xx][yy][zz]=='#'||vis[xx][yy][zz])
continue;
else if(a[xx][yy][zz]=='E')
{
return hd.step+1;
}
vis[xx][yy][zz]=1;
tmp.x=xx;
tmp.y=yy;
tmp.z=zz;
tmp.step=hd.step+1;
q.push(tmp);
}
}
return 0;
}
int main()
{
while(cin>>l>>r>>c)
{
memset(vis,0,sizeof(vis));
if(l+r+c==0)
break;
int i,j,k;
for(i=0;i<l;i++)
for(j=0;j<r;j++)
for(k=0;k<c;k++)
{
cin>>a[i][j][k];
if(a[i][j][k]=='S')
{
sx=i;
sy=j;
sz=k;
a[i][j][k]='#';
}
}
int ans=0;
ans=bfs(sx,sy,sz);
if(ans)
cout<<"Escaped in "<<ans<<" minute(s)."<<endl; //这里一开始我分开处理,错了
else
cout<<"Trapped!"<<endl;
}
}