Description

雷德利斯科特导演在为最新的异形三部曲终章《觉醒》征集主演,达达学长在宿舍观看《普罗米修斯》的时候看到剧中的主演们一个又一个成为异形的盘中餐,达达学长认为他们太笨了,决定亲自上阵会一会异形
斯科特导演为了考验主角的智慧,将达达学长扔到了一艘名叫小学期的阴森的太空船中并派生化人bluesky去帮助他.万万没想到的是,生化人bluesky叛变了,达达学长惊慌失措的开始在太空船中逃亡.
达达学长的情况现在万分危机,前面未知的船舱中游荡着一只异形,后面还有生化人bluesky的追击.
因为生化人bluesky的追击,达达学长绝对不能走回头路也不能在原地停留一刻,现在达达学长呼叫你来帮助他,因为只有你知道整个太空船的构造和异形的位置.
(为了处理方便)现在你已知太空船是一个高Hight,宽Row,长Col的长方体,(为了简单起见)船中游荡着1只异形,你拥有的先进的动作感知器已经捕捉到了异形的运动规律(异形穿墙还不是分分钟的事情)和异形的感觉范围,现在请你帮助达达学长找出一条逃生的路
达达学长每次最快只能走一格,异形也是.
情况万分危机,现在达达学长只想知道他是否可以幸存(因为生化人bluesky的追杀,达达学长只会走前往逃生舱的最短路径不会兜圈子),如果幸存输出需要多长时间才可以到达逃生舱,如果不能幸存输出-1

Input

       1. 首先输入船高H,船宽R,船长C三个整数n, n大于等于3小于等于30
  2. 之后按序输入H个二维地图,每一个二维地图都是代表太空船的一层,地图中.符号代表一格通道,#代表船身,S代表达达学长当前的位置,E代表太空船的逃生舱的位置
  3. 之后输入两个整数a,b , 其中a代表异形的移动的位置数目,b代表异形的感知范围
  4. 之后输入a行数据,每一行存在3个整数代表异形活动的位置的坐标,异形按照输入的顺序做有规律的来回移动
  5. 达达学长逃亡的过程中不能出现在异形的感觉范围内,否则会立刻被追杀

       6. 输入包含多组用例,最后一组用例用0 0 0结尾并且不做任何处理

Output

       如果达达学长可以逃亡成功输出达达学长到达逃生舱的最短时间n,

       输出格式 : Escaped in n minute(s).

       如果达达学长不能逃亡成功请输出-1

PS :

1. 异形的感知是6个方向,所谓的感知范围表示的是异形在某一个方向上的视觉的延伸

2. a大小是没有具体限制的,太空船多大,a就会有多大a的最小限制是1

3. 异形有规律的来回移动

    (1,1)->(1,2)->(1,3)->(1,2)->(1,1)

测试用例:

输入:


3 4 5 .S... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 4 0 1 2 2 1 3 2 1 3 3 1 3 4 1 3 3 S## #E# ### 1 2 0 0 0 0 0 0


输出:


-1 -1


题解:

最开始有个地方搞错了就是,异性坐标为1,1,1时是在第2层,第2行,第2列处,也就是0为第一层/行/列。

然后这题就是一道三维bfs,用一个dis[][][]记录每个点到S距离,初始化为INF,如果到达一个点的时候正好在异形的范围内,那么终止这条路径,把这个点记为#,最终看dis[x][y][z]是否为一个整数而不是INF,判断能不能走出去。


代码:

#include<stdio.h>
#include<string.h>
char map[31][31][31];
int h,r,c,a,b;
typedef struct{
	short h,x,y;
}node;
node que[30000],pos[30000];
node s,e;
int dis[31][31][31];
short dx[]={-1,0,1,0,0,0};
short dy[]={0,-1,0,1,0,0};
short dh[]={0,0,0,0,-1,1};
int inf=0x3f3f3f3f;

int main()
{
	while(scanf("%d%d%d",&h,&r,&c),(h!=0&&r!=0&&c!=0)){
		
		int i,j,k,l;
		
		for(i=0;i<31;i++)
		for(j=0;j<31;j++)
		for(k=0;k<31;k++)
		dis[i][j][k]=inf;
		
		for(k=0;k<h;k++)
		for(i=0;i<r;i++)
		{
			scanf("%s",map[k][i]);
			for(j=0;j<c;j++)
			{
				if(map[k][i][j]=='S')
				{
					s.h=k,s.x=i,s.y=j;
					map[k][i][j]='#';
					dis[k][i][j]=0;
				}
				if(map[k][i][j]=='E') e.h=k,e.x=i,e.y=j;
			}
		}
		
		scanf("%d%d",&a,&b);
		for(i=0;i<a;i++)
		{
			scanf("%d%d%d",&pos[i].h,&pos[i].x,&pos[i].y);
		}
		
		int p1=0,p2=0;
		que[p2++]=s;
		while(p2>=p1)
		{
			node now=que[p1++];
			if(now.h==e.h&&now.y==e.y&&now.x==e.x)
				break;
			for(i=0;i<6;i++)
			{
				short hh=now.h+dh[i],xx=now.x+dx[i],yy=now.y+dy[i];
				if(xx<0||yy<0||hh<0||xx>r-1||yy>c-1||hh>h-1||map[hh][xx][yy]=='#')
					continue;
					
				int intex;
				if(a==1) intex=0;
				else if(a==2) intex=(dis[now.h][now.x][now.y]+1)%2;
				else
				{
					intex=((dis[now.h][now.x][now.y]+1)%(2*a-2));
					if(intex>=a) intex=2*(a-1)-intex;
				}
				node poss=pos[intex];
				if((poss.h==hh&&poss.x==xx&&yy<=poss.y+b&&yy>=poss.y-b)||(poss.h==hh&&poss.y==yy&&xx<=poss.x+b&&xx>=poss.x-b)||(poss.y==yy&&poss.x==xx&&hh<=poss.h+b&&hh>=poss.h-b))
					continue;
				
				map[hh][xx][yy]='#';
				dis[hh][xx][yy]=dis[now.h][now.x][now.y]+1;
				node temp;
				temp.x=xx,temp.y=yy,temp.h=hh;
				que[p2++]=temp;
			}
		}
		
		if(dis[e.h][e.x][e.y]==inf)
		printf("-1\n");
		else  printf("Escaped in %d minute(s).\n",dis[e.h][e.x][e.y]);
	}
	return 0;
}