【GRYZ模拟赛】GRYZ追击时刻

Description

XYD过完年后高高兴兴的回到了GRYZ,然后他发现可爱的Robot已经在这里等待了3天,由于Robot跑的很慢,所以她正在准备施展魔法,逮住 XYD XYD知道,除了男生宿舍,其他的地方都会被Robot宝宝魔法控制(因为宝宝是一个可爱的女孩子),如果XYD被控制之后,就会发生很可怕的 事情。。。

所以,XYD一定要尽快赶回男生宿舍。 GRYZ可以用一个N*MN,M<=50)的地图表示,地图上有5种符号:"X S D . *" 。其中“X”处有可怕的兔兔(兔兔可能很多),XYDRobot都不能经过。 "."表示XYD和魔法都能经过的地方。*”表示Robot的位置,“S”表示XYD起始位置,“D”表示男生宿舍。 xyd每秒钟可以向相邻位置移动,Robot的魔法也会向相邻的地方蔓延(从已覆盖的区域,开始只覆盖*点)。众所周知,宝宝魔法就像是一股水流。

XYD回到男生宿舍的最短时间,如果XYD回不到男生宿舍,就有可能被迫以身相许,那么他就会高兴的大喊一声“I Love xxx!!!”。(这就是很可怕的事情)

Input

第一行为正整数nm;以下nm列为地图。

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

 

posted @ 2016-02-23 20:46  mengyue  阅读(372)  评论(0编辑  收藏  举报