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;
}