题意:一个立体空间, 输入三个数,L,R,C,代表有L个平面,R行,C列,.代表可以走,#代表不能走,S代表开始点,E代表结束点,问从S开始走,对每个位置,有六个走法,即空间的六个方向的走法(上下东南西北),一分钟可以走一个点,问从S走到E点,最少可以经过多少分钟,若不能到达,则输出Trapped!
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct q
{
int x,y,z;
} q[30000];
int length[30000];
int xx[]= {1,-1,0,0,0,0};
int yy[]= {0,0,0,0,-1,1};
int zz[]= {0,0,-1,1,0,0};
bool dis[40][40][40];
char map[40][40][40];
int l,r,c,sx,sy,sz;
int bfs()
{
int rear,front,dx,dy,dz,i;
memset(dis,false,sizeof(dis));
memset(length,0,sizeof(length));
q[0].x=sx,q[0].y=sy,q[0].z=sz;
front=rear=0;
while(front<=rear)
{
for(i=0; i<6; i++)
{
dx=q[front].x+xx[i];
dy=q[front].y+yy[i];
dz=q[front].z+zz[i];
if(!dis[dx][dy][dz] && (map[dx][dy][dz]=='.' || map[dx][dy][dz]=='E') && dx>=0 && dx<l && dy>=0 && dy<r && dz>=0 && dz<c)
{
dis[dx][dy][dz]=true;
q[++rear].x=dx;
q[rear].y=dy;
q[rear].z=dz;
length[rear]=length[front]+1;
if(map[dx][dy][dz]=='E') return length[rear];
}
}
front++;
}
return 0;
}
int main()
{
int i,j,k,key;
while(scanf("%d%d%d\n",&l,&r,&c))
{
if(l==0 && r==0 && c==0) break;
for(i=0; i<l; i++,getchar())
for(j=0; j<r; j++,getchar())
for(k=0; k<c; k++)
{
scanf("%c",&map[i][j][k]);
if(map[i][j][k]=='S') sx=i,sy=j,sz=k;
}
key=bfs();
if(key) printf("Escaped in %d minute(s).\n",key);
else printf("Trapped!\n");
}
return 0;
}