zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    用mapreduce 处理气象数据集
    熟悉常用的HBase操作
    爬虫大作业
    熟悉常用的HDFS操作
    数据结构化与保存
    获取全部校园新闻
    爬取校园新闻首页的新闻的详情,使用正则表达式,函数抽离
    NPOI的excel导出1
    DbHelperSQL帮助类
    C# mvc导出excel
  • 原文地址:https://www.cnblogs.com/liumengyue/p/5211176.html
Copyright © 2011-2022 走看看