[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 }

 

原文地址:https://www.cnblogs.com/hualian/p/11153127.html