题是简单广搜,但是要注意,移动的次数比点少一,所以加一就行。poj3984里面是点,所以是差两个。
#include<stdio.h>
char map[32][32][32];
int front=0,rear=1,shijian=0,l,r,c,l0,r0,c0,lt,rt,ct;
struct node{
int x,y,h,pre;
}q[30000];
void time(int front)
{
if(q[front].pre!=-1){
shijian++;
time(q[front].pre);
}
}
void bfs(int h,int x,int y)
{
int a,b,d;
int to[6][3]={{0,1,0},{0,-1,0},{0,0,1},{0,0,-1},{1,0,0},{-1,0,0}};
q[front].h=h;
q[front].x=x;
q[front].y=y;
q[front].pre=-1;
while(front<rear)
{
for(int i=0;i<=5;i++)
{
//printf("di %d ci\n",i);
d=q[front].h+to[i][0];
a=q[front].x+to[i][1];
b=q[front].y+to[i][2];
if(d<0||d>=l||a<0||a>=r||b<0||b>=c||map[d][a][b]=='#')
continue;
else{
map[d][a][b]='#';
q[rear].h=d;
q[rear].x=a;
q[rear].y=b;
q[rear].pre=front;
rear++;
}
if(d==lt && a==rt && b==ct) {time(front);}
}
front++;//一定要看清front++的位置
}
}
int main()
{
scanf("%d%d%d",&l,&r,&c);
while ( (l!=0||r!=0||c!=0))
{
front=0;
rear=1;
shijian=0;
for(int i=0;i<l;i++)
{
for(int j=0;j<r;j++)
{
scanf("%s",map[i][j]);
for(int k=0;k<c;k++)
{
if(map[i][j][k]=='E'){lt=i;rt=j;ct=k;}
if(map[i][j][k]=='S'){l0=i;r0=j;c0=k;}
}
}
}
bfs(l0,r0,c0);
shijian=shijian+1;
if(shijian!=1) printf("Escaped in %d minute(s).\n",shijian);
else printf("Trapped!\n");
scanf("%d%d%d",&l,&r,&c);
}
return 0;
}