【GRYZ模拟赛】GRYZ追击时刻
Description
XYD过完年后高高兴兴的回到了GRYZ,然后他发现可爱的Robot已经在这里等待了3天,由于Robot跑的很慢,所以她正在准备施展魔法,逮住 XYD。 XYD知道,除了男生宿舍,其他的地方都会被Robot宝宝魔法控制(因为宝宝是一个可爱的女孩子),如果XYD被控制之后,就会发生很可怕的 事情。。。
所以,XYD一定要尽快赶回男生宿舍。 GRYZ可以用一个N*M(N,M<=50)的地图表示,地图上有5种符号:"X S D . *" 。其中“X”处有可怕的兔兔(兔兔可能很多),XYD和Robot都不能经过。 "."表示XYD和魔法都能经过的地方。 “*”表示Robot的位置,“S”表示XYD起始位置,“D”表示男生宿舍。 xyd每秒钟可以向相邻位置移动,Robot的魔法也会向相邻的地方蔓延(从已覆盖的区域,开始只覆盖*点)。众所周知,宝宝魔法就像是一股水流。
求XYD回到男生宿舍的最短时间,如果XYD回不到男生宿舍,就有可能被迫以身相许,那么他就会高兴的大喊一声“I Love xxx!!!”。(这就是很可怕的事情)
Input
第一行为正整数n和m;以下n行m列为地图。
Output
如果能成功回到男生宿舍输出最短时间,否则输出“I Love xxx!!!”(不包括双引号)
Sample Input
样例输入1
3 3
D.*
…
.S.
样例输入2
3 3
D.*
…
..S
Sample Output
样例输出1
3
样例输出2
I Love xxx!!!
题解
这道题画风有点不正常,但这不是重点666,重点是我真的超级喜欢栋栋!
两遍宽搜,第一遍处理出魔法到点[i][j]的时间(因为栋栋跑到点[i][j]的条件是没有兔子,并且没有被魔法覆盖),第二遍栋栋开始逃跑~
注意 == 不要写成 =
注意 == 不要写成 =
注意 == 不要写成 =
#include<iostream> #include<cstdio> #include<cstring> #define N 55 using namespace std; struct node { int x,y; }q[N*N*4];//可能有点入队不止一次 int map[N][N]={0}; //存有些不能走的点 int tim[N][N]; //存魔法到达的时间 int xyd[N][N]; //存xyd到达该点的时间 int xx[5] = {0,-1,1,0,0}; int yy[5] = {0,0,0,-1,1}; int n,m,h,t,e1,e2,d1,d2,x,y; char str[55]; int main() { freopen("clikar.in","r",stdin); freopen("clikar.out","w",stdout); memset(tim,127,sizeof(tim)); h=0; t=0; scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) { scanf("%s",str+1); for (int j=1;j<=m;j++) { if (str[j] == '*') //Robot位置,第一遍宽搜用 { tim[i][j] = 1; q[++t].x = i; q[t].y = j; } if (str[j] == 'S') //栋栋位置,第二遍宽搜用 { d1 = i; d2 = j; } if (str[j] == 'D') //终点位置 { e1 = i; e2 = j; map[i][j] = 1; } if (str[j] == 'X') //兔兔位置(不能走) { map[i][j] = 2; } } } while (h<t) //第一遍宽搜,处理魔法,建立出tim数组(tim[i][j]是魔法到达[i][j]点的时间) { x = q[++h].x; y = q[h].y; for (int i=1;i<=4;i++) { int qx = x+xx[i], qy = y+yy[i]; if (qx && qx<=n && qy && qy<=m && !map[qx][qy] && tim[qx][qy]>tim[x][y]+1) //map数组在这里,终点和X魔法都不能走 { tim[qx][qy] = tim[x][y]+1; q[++t].x = qx; q[t].y = qy; } } } memset(xyd,127,sizeof(xyd)); xyd[d1][d2] = 1; h = 0; t = 1; q[t].x = d1; q[t].y = d2; while (h<t) { x = q[++h].x; y = q[h].y; for (int i=1;i<=4;i++) { int qx = x+xx[i], qy = y+yy[i]; if (qx && qx<=n && qy && qy<=m && map[qx][qy]<2 && xyd[qx][qy]>xyd[x][y]+1 && xyd[x][y]+1<tim[qx][qy])//魔法不到 { xyd[qx][qy] = xyd[x][y] +1; q[++t].x = qx; q[t].y = qy; } } } if (xyd[e1][e2] == 2139062143) printf("I Love xxx!!!"); else printf("%d",xyd[e1][e2]-1); fclose(stdin); fclose(stdout); return 0; }