题意:在三维的图里从S走到E,'.'可以走,'#'不能走,求最小步数。
思路:水BFS。
#include<iostream>
using namespace std;
struct point
{
int x,y,z;
int step;
}P[30000];
int dx[6]={-1,1,0,0,0,0};
int dy[6]={0,0,1,-1,0,0};
int dz[6]={0,0,0,0,1,-1};
int vis[35][35][35];
char s[35][35][35];
int main()
{
int L,R,C;
int sx,sy,sz,ex,ey,ez;
while(scanf("%d%d%d",&L,&R,&C)!=EOF)
{
if(L==0&&R==0&&C==0) break;
for(int i=1;i<=L;i++)
for(int j=1;j<=R;j++)
for(int k=1;k<=C;k++)
{
cin>>s[i][j][k];
if(s[i][j][k]=='S')
{
sx=i;sy=j;sz=k;
vis[i][j][k]=0;
}
else if(s[i][j][k]=='E')
{
ex=i;ey=j;ez=k;
vis[i][j][k]=0;
}
else if(s[i][j][k]=='.')
vis[i][j][k]=0;
else if(s[i][j][k]=='#')
vis[i][j][k]=1;
}
//printf("%d %d %d,%d %d %d\n",sx,sy,sz,ex,ey,ez);
//system("pause");
point start,node;
int front,rear;
int xx,yy,zz;
front=rear=0;
start.x=sx;start.y=sy;start.z=sz;start.step=0;
P[rear++]=start;
int flag=0;
while(front!=rear&&!flag)
{
start=P[front++];
for(int k=0;k<6;k++)
{
xx=start.x+dx[k];
yy=start.y+dy[k];
zz=start.z+dz[k];
if(xx>=1&&xx<=L&&yy>=1&&yy<=R&&zz>=1&&zz<=C&&!vis[xx][yy][zz])
{
vis[xx][yy][zz]=1;
node.x=xx;
node.y=yy;
node.z=zz;
node.step=start.step+1;
P[rear++]=node;
if(s[xx][yy][zz]=='E')
{
printf("Escaped in %d minute(s).\n",node.step);
flag=1;
}
}
}
}
if(front==rear&&!flag)
printf("Trapped!\n");
//system("pause");
}
return 0;
}