• 72.2801 LOL-盖伦的蹲草计划(广搜)


    时间限制: 1 s

     空间限制: 256000 KB

     题目等级 : 黄金 Gold

     查看运行结果

    题目描述 Description

    众所周知,LOL这款伟大的游戏,有个叫盖伦的英雄。他的伟大之处在于他特别喜欢蹲草丛阴人(XL:蹲草阴人也算英雄?!CZQ:没办法,个个都是这么玩的)。某日,德玛西亚与诺克萨斯之间又发生了一场战斗,嘉文四世希望盖伦能带领一支K人的德玛西亚军队出战。

    战斗发生在召唤师峡谷。整个召唤师峡谷被分割成MN列的一个矩阵,矩阵中有空地和几片草丛。这几片草丛中有些很大、有些很小。一个1×1的草丛能容纳3个士兵,盖伦坚信蹲草偷袭战术能战胜诺克萨斯军队,所以他希望他的军队能全部蹲进草丛里。当然,为了不影响盖伦的作战,盖伦需要单独霸占连起来的一片草丛(不管草丛有多大)。

     

    输入描述 Input Description

    第一行MNK,表示矩阵的行数、列数和士兵数量。
    接下来M行,输入矩阵,'.'代表平地,'*'代表草丛。

    输出描述 Output Description

    如果德玛西亚军队和盖伦都能躲进草丛里,则输出“Demacia Win!”,否则输出“Demacia Lose!”

    样例输入 Sample Input

    3 3 6
    .**
    ...
    .*.

    样例输出 Sample Output

    Demacia Win!

    数据范围及提示 Data Size & Hint

    1<=mn<=1500
    1<=k<=1500
    P.S
    :这里对于两个1×1的草丛是否连在一起的定义是:对于每个1×1的草从,它与周围(上下左右)的草丛是连在一起的。

    分类标签 Tags 点此展开 

    广度优先搜索 模拟 深度优先搜索 搜索

    基本思路:宽度优先搜索,输入时记录草丛的总数目,宽搜时找出最小的草丛,让盖伦待在那里,其余的点放小兵,把其余的点的数目*3与小兵的数目比较就可以了,

    代码:

    #include

    using namespace std;

    #include

    #include

    int n,m,jz[5002][5002]={0};

    int xx[4]={0,0,1,-1};

    int yy[4]={1,-1,0,0};

    const int INF=0x7fffffff;

    struct  Poi{

        int x,y;

       

    };

    Poi poi[5001*5001];

    long long head,tail,k,grasssum,mingrass=INF;

    char p[5002];

    void input()

    {

        scanf("%d%d%d",&m,&n,&k);

        for(int i=1;i<=m;++i)

        {

           memset(p,0,sizeof(p));

           scanf("%s",p+1);

           for(int j=1;j<=n;++j)

           {

               if(p[j]=='*')

               {

                  jz[i][j]=1;

                  grasssum++;

               }

           }

        }

       

    }

    void BFS()

    {

       

        for(int i=1;i<=m;++i)

        {

           for(int j=1;j<=n;++j)

           {

               head=0;tail=0;

               int sum=0;

               if(jz[i][j])

               {

                  poi[++tail].x=i;

                  poi[tail].y=j;

                    jz[i][j]=0;

               }

               while(head

               {

                  ++head;

                  int x1=poi[head].x,y1=poi[head].y;

                  sum++;

              

                  for(int l=0;l<=3;++l)

                  {

                      int x2=x1+xx[l],y2=y1+yy[l];

                      if(x2>=1&&x2<=m&&y2>=1&&y2<=n&&jz[x2][y2]==1)

                      {

                         ++tail;

                         poi[tail].x=x2;

                         poi[tail].y=y2;

                         jz[x2][y2]=0;

                      }

                  }

               }

               if(sum

               mingrass=sum;

               //if(sum!=0)

           //  cout<<sum<<endl;

              

           }

        }

    }

    int main()

    {

        input();

        BFS();

        grasssum-=mingrass;

        if(grasssum*3>=k)//xing

        printf("Demacia Win! ");

        else printf("Demacia Lose! ");

       

        return 0;

    }

  • 相关阅读:
    Flutter 布局类组件:简介
    Flutter 基础组件:进度指示器
    Flutter 基础组件:单选框和复选框
    Flutter 基础组件:图片和Icon
    Flutter 基础组件:按钮
    Flutter 基础组件:文本、字体样式
    Flutter 基础组件:状态管理
    Flutter 基础组件:Widget简介
    网络编程之TCP
    入门多线程
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5370747.html
Copyright © 2020-2023  润新知