題目鏈接:點擊打開鏈接
這道題竟然在dfs裏,不太懂。不過用bfs做就是水題了,只不過4個方向變成了6個方向。
//768K 16MS
//C++ 1610B
#include <cstdio>
#include <cstring>
int n,m,sum,l;
int p1[6][3]={{0,-1,0},{0,0,1},{0,1,0},{0,0,-1},{1,0,0},{-1,0,0}};
char map[33][33][33];
int vis[33][33][33];
struct node
{
int x,y,l,dis;
}q[36000];
int bfs(int x,int y,int k)
{
int in=0,out=0;
vis[l][x][y]=1;
q[in].x=x;
q[in].y=y;
q[in].dis=0;
q[in++].l=k;
while(in>out)
{
int x1=q[out].x;
int y1=q[out].y;
int l1=q[out].l;
int dis=q[out++].dis;
if(map[l1][x1][y1]=='E')
return dis;
for(int i=0;i<6;i++)
{
int sx=x1+p1[i][1];
int sy=y1+p1[i][2];
int sl=l1+p1[i][0];
if(sx>=0&&sx<n&&sy>=0&&sy<m&&sl>=0&&sl<l&&!vis[sl][sx][sy]&&map[sl][sx][sy]!='#')
{
vis[sl][sx][sy]=1;
q[in].x=sx;
q[in].y=sy;
q[in].l=sl;
q[in++].dis=dis+1;
}
}
}
return 0;
}
int main()
{
int i,j,k,x1,y1,l1;
while(~scanf("%d%d%d",&l,&n,&m)&&(n||m||l))
{
sum=0;
memset(vis,0,sizeof(vis));
for(k=0;k<l;k++)
{
for(i=0;i<n;i++)
{
scanf("%s",map[k][i]);
for(j=0;j<m;j++)
{
if(map[k][i][j]=='S')
x1=i,y1=j,l1=k;
}
}
getchar();
}
int z=bfs(x1,y1,l1);
if(z)
printf("Escaped in %d minute(s).\n",z);
else
printf("Trapped!\n");
}
return 0;
}