zoukankan      html  css  js  c++  java
  • [USACO09OCT]【乳草的侵占】

    描述

      Farmer John 一直努力让他的草地充满鲜美多汁的而又健康的牧草。可惜天不从人愿,他在植物大战人类中败下阵来。邪恶的乳草已经在他的农场的西北部份占领了一片立足之地。 草地像往常一样,被分割成一个高度为 Y(1 ≤ Y ≤ 1000), 宽度为 X(1 ≤ X ≤ 1000) 的直角网格。(1,1)是左下角的格(也就是说坐标排布跟一般的 X,Y 坐标相同)。乳草一开始占领了格 (M_xMx,M_yMy)。

      每个星期,乳草传播到已被乳草占领的格子四面八方的每一个没有很多石头的格(包括垂直与水平相邻的和对角线上相邻的格)。1 周之后,这些新占领的格又可以把乳草传播到更多的格里面了。 Bessie 想要在草地被乳草完全占领之前尽可能的享用所有的牧草。她很好奇到底乳草要多久才能占领整个草地。如果乳草在 0 时刻处于格 (M_x,M_y),那么在哪个时刻它们可以完全占领入侵整片草地呢(对给定的数据总是会发生)? 草地由一个矩阵表示。'.'表示草,而'*'表示大石。 比如这个 X=4, Y=3 的例子。

    ....           
    ..*.           
    .**.
    
    如果乳草一开始在左下角(第 1 排,第 1 列),那么草地的地图将会以如下态势发展:
    
    第 0 周
    ....
    ..*.
    M**.
    
    第 1 周 
    ....
    MM*.
    M**.
    
    第 2 周 
    MMM.
    MM*.
    M**.
    
    第 3 周 
    MMMM
    MM*M
    M**.
    
    第 4 周 
    MMMM
    MM*M
    M**M
    
    乳草会在 4 星期后占领整片土地。
    

      

    输入输出格式

    输入

      第一行:四个由空格隔开的整数 X,Y,M_xMx,M_yMy

      第 2 到第 Y+1 行:每行由 X个字符('.' 表示草地,'*' 表示大石),描述草地的状况。

    输出

      一个单独的整数表示最后一个不是大石块的格子被乳草占领的星期数。

    输入输出样例

    输入样例1

    4 3 1 1
    ....
    ..*.
    .**.

    输出样例1

    4

    解题思路

      我用结构体记录横纵坐标及深度,每次塞入队列,向八个方向搜索,并时刻更新值。

    题解

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 char G[1005][1005];//存图 
     4 const int dir[8][2]{{1,0},{-1,0},{1,1},{0,1},{-1,1},{1,-1},{0,-1},{-1,-1}};//8个方向 
     5 int g[1005][1005];//标记 
     6 int ttt=0;//随时更新的最终值 
     7 struct node{
     8     int y;
     9     int x;
    10     int t;
    11     node(int yy,int xx,int tt)//构造函数,方便 
    12     {
    13         y=yy;
    14         x=xx;
    15         t=tt;
    16     }
    17 };
    18 void bfs(int y,int x)
    19 {
    20     queue<node> sj;//node类型的队列 
    21     node tmp=node(y,x,0);
    22     sj.push(node(y,x,0));
    23     g[y][x]=true;//打标记 
    24     while(!sj.empty())
    25     {
    26         node now=sj.front();
    27         sj.pop();
    28         ttt=now.t;//更新 
    29         for(int j=0;j<8;j++)//搜索 
    30         {
    31             int ty=now.y+dir[j][1];
    32             int tx=now.x+dir[j][0];
    33             if(G[now.y][now.x]=='.'&&!g[ty][tx])//判断合法 
    34             {
    35                 g[ty][tx]=true;//打标记然后放进队列 
    36                 sj.push(node(ty,tx,now.t+1));
    37             }
    38         }
    39     }
    40     cout<<ttt-1;
    41 } 
    42 int main()
    43 {
    44     int x,y,mx,my;
    45     scanf("%d%d%d%d",&x,&y,&mx,&my);
    46     for(int i=y;i>=1;i--)
    47     {
    48         for(int j=1;j<=x;j++)
    49         {
    50             cin>>G[i][j];//存图 
    51         }
    52     }
    53     bfs(my,mx);//开始搜索 
    54     return 0;
    55 }

     

  • 相关阅读:
    Gridview如何用自定义按钮进行编辑和提交修改
    winform多线程中给datagridview绑定数据源
    DevExpress控件WebchartControl的学习记录
    datagridview右键选中单元格并获取到焦点
    asp.net局部页面打印,以及如何去掉打印时自动保留的URL地址(页眉页脚)
    GridView如何实现点击某行的指定列弹出新窗体
    C# Color Font 与String之间的转换
    推荐一款 asp.net js日历控件
    js浮点运算替代函数
    VSeWss 1.3 CTP 安装后出现错误
  • 原文地址:https://www.cnblogs.com/hualian/p/11153127.html
Copyright © 2011-2022 走看看