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;

}

原文地址:https://www.cnblogs.com/c1299401227/p/5370747.html