• Codevs 2801 LOL盖伦的蹲草计划


    题目描述 Description

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

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

    输入描述 Input Description

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

    输出描述 Output Description

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

    样例输入 Sample Input

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

    样例输出 Sample Output

    Demacia Win!

    数据范围及提示 Data Size & Hint

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

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<queue>
     5 using namespace std;
     6 int m,n,k,a[1500+10][1500+10],dis[1801];
     7 int x0[4]={0,0,1,-1},y0[4]={1,-1,0,0},p=0;
     8 bool f=false;
     9 void init()
    10 {
    11     scanf("%d%d%d",&m,&n,&k);
    12     getchar();
    13     for(int i=1;i<=m;i++)
    14     {
    15         for(int j=1;j<=n;j++)
    16         {
    17             char c;
    18             scanf("%c",&c);
    19             if(c=='.') a[i][j]=0;
    20             else a[i][j]=1;
    21         }
    22     getchar();
    23     }
    24 }
    25 queue<int> qx,qy;
    26 void ss()
    27 {
    28     for(int i=1;i<=m;i++)
    29         for(int j=1;j<=n;j++)
    30             if(a[i][j])
    31             {
    32                 p++;
    33                 queue<int> qx,qy;
    34                 qx.push(i),qy.push(j);
    35                 dis[p]++;
    36                 a[i][j]=0;
    37                 while(!qx.empty()) 
    38                 {
    39                     int xx=qx.front(),yy=qy.front();
    40                     qx.pop();qy.pop();
    41                     for(int k=0;k<4;k++)
    42                     {
    43                         int zx=xx+x0[k],zy=yy+y0[k];
    44                         if(a[zx][zy])
    45                         {
    46                             qx.push(zx);qy.push(zy);
    47                             dis[p]++;
    48                             a[zx][zy]=0;
    49                         }
    50                     }
    51                 }
    52             }
    53 }
    54 void sss()
    55   {
    56       sort(dis+1,dis+p+1);
    57       int q=0;
    58       for(int i=2;i<=p;i++)
    59         q+=dis[i];
    60       if(3*q>=k)
    61         {
    62             f=true;
    63             return;
    64         }
    65   }
    66 int main()
    67 {
    68     init();
    69     ss();
    70     //for(int i=1;i<=p;i++) printf("%d ",dis[i]);
    71     sss();
    72     if(f==true) printf("Demacia Win!
    ");
    73     else printf("Demacia Lose!
    ");
    74     return 0;
    75 }

    思路:宽搜,求出每个联通块的大小,最小的那个给盖伦,其余的藏小兵

    80分的AC代码~~5555555.....

    轮Code【vs】的操蛋性:

    心塞~不说啥了

  • 相关阅读:
    4.20 每日一练
    4.19 每日一练
    4.18 每日一练
    Python函数初
    Python的文件操作
    python购物车
    python深浅拷贝,集合以及数据类型的补充
    Python 代码块 小数据池
    Python字典
    Python 列表操作
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6055540.html
Copyright © 2020-2023  润新知