TYVJ 1030 乳草的入侵(BFS)

背景 Background

USACO OCT09 6TH

描述 Description

Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草。可惜天不从人愿,他在植物大战人类中败下阵来。邪恶的乳草已经在他的农场的西北部份佔领了一片立足之地。
草地像往常一样,被分割成一个高度為Y(1 <= y <= 100), 宽度為X(1 <= x <= 100)的直角网格。(1,1)是左下角的格(也就是说坐标排布跟一般的X,Y坐标相同)。乳草一开始佔领了格(Mx,My)。每个星期,乳草传播到已被乳草佔领的格子四面八方的每一个没有很多石头的格(包括垂直与水平相邻的和对角线上相邻的格)。1周之后,这些新佔领的格又可以把乳草传播到更多的格裡面了。
Bessie想要在草地被乳草完全佔领之前尽可能的享用所有的牧草。她很好奇到底乳草要多久才能佔领整个草地。如果乳草在0时刻处於格(Mx,My),那麼还在那个时刻它们可以完全佔领入侵整片草地呢(对给定的数据总是会发生)?
草地由一个图片表示。"."表示草,而"*"表示大石。比如这个X=4, Y=3的例子。

....
     ..*.
     .**.

如果乳草一开始在左下角(第1排,第1列),那麼草地的地图将会以如下态势发展:

....  ....  MMM.  MMMM  MMMM  
      ..*.  MM*.  MM*.  MM*M  MM*M  
      M**.  M**.  M**.  M**.  M**M  
星期数  0     1     2     3     4

乳草会在4星期后佔领整片土地。

输入格式 InputFormat

* 第一行: 四个由空格隔开的整数: X, Y, Mx, My
* 第2到第Y+1行: 数据的第y+1行由X个字符("."表示草地,"*"表示大石),描述草地的
第(Y+2-y)行。

输出格式 OutputFormat

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

样例输入 SampleInput

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

样例输出 SampleOutput

4

这道题思路就是BFS,注意输入,先输入列后输入行。

一开始的想法是判断是否所有的路都被乳草占领了,如果全部全部被占领了,输出结果。(这里输出哪一个星期的时候要输出next.step,因为你是把节点扩展之后判断的,意思就是说,你下个星期会不会被全部占领)

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 #include<stdlib.h>
 5 using namespace std;
 6 char a[105][105];
 7 int vis[105][105];
 8 int dir[8][2]={{-1,0},{0,1},{1,0},{0,-1},{-1,1},{1,1},{1,-1},{-1,-1}};
 9 int n,m,sx,sy,day,cnt,sum,num;
10 struct node
11 {
12     int x,y;
13     int step;
14 }star;
15 void BFS()
16 {
17     memset(vis,0,sizeof(vis));
18     star.x=sx;
19     star.y=sy;
20     star.step=0;
21     queue<node> q;
22     q.push(star);
23     vis[star.x][star.y]=1;
24     while(!q.empty())
25     {
26         node now,next;
27         now=q.front();
28         q.pop();
29         for(int i=0;i<8;i++)
30         {
31             next.x=now.x+dir[i][0];
32             next.y=now.y+dir[i][1];
33             if(0<=next.x&&next.x<n&&0<=next.y&&next.y<m&&!vis[next.x][next.y]&&a[next.x][next.y]!=‘*‘)
34             {
35                  next.step=now.step+1;
36                  q.push(next);
37                  vis[next.x][next.y]=1;
38                  cnt++;
39             }
40         }
41         if(cnt==sum)
42         {
43             printf("%d\n",next.step);
44             return ;
45         }
46     }
47     return ;
48 }
49 int main()
50 {
51     day=0,cnt=1,num=0;
52     scanf("%d %d %d %d",&m,&n,&sy,&sx);
53     for(int i=0;i<n;i++)
54         scanf("%s",a[i]);
55     star.x=sx--;
56     star.y=sy--;
57     for(int i=0;i<n;i++)
58         for(int j=0;j<m;j++)
59             if(a[i][j]==‘*‘)
60                 num++;
61
62     sum=n*m-num;
63     BFS();
64     //printf("%d %d\n",sum,num);
65    // printf("%d\n",day);
66    //printf("%d\n",cnt);
67     return 0;
68 }

后来发现另外一种记录第几个星期的方法

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 #include<stdlib.h>
 5 using namespace std;
 6 char a[105][105];
 7 int vis[105][105];
 8 int dir[8][2]={{-1,0},{0,1},{1,0},{0,-1},{-1,1},{1,1},{1,-1},{-1,-1}};
 9 int n,m,sx,sy,day;
10 struct node
11 {
12     int x,y;
13     int step;
14 }star;
15 void BFS()
16 {
17     memset(vis,0,sizeof(vis));
18     star.x=sx;
19     star.y=sy;
20     star.step=0;
21     queue<node> q;
22     q.push(star);
23     vis[star.x][star.y]=1;
24     while(!q.empty())
25     {
26         node now,next;
27         now=q.front();
28         q.pop();
29         for(int i=0;i<8;i++)
30         {
31             next.x=now.x+dir[i][0];
32             next.y=now.y+dir[i][1];
33             if(0<=next.x&&next.x<n&&0<=next.y&&next.y<m&&!vis[next.x][next.y]&&a[next.x][next.y]!=‘*‘)
34             {
35                  next.step=now.step+1;
36                  q.push(next);
37                  vis[next.x][next.y]=1;
38                  if(day<next.step)
39                     day=next.step;
40             }
41         }
42     }
43     return ;
44 }
45 int main()
46 {
47     day=0;
48     scanf("%d %d %d %d",&m,&n,&sy,&sx);
49     for(int i=0;i<n;i++)
50         scanf("%s",a[i]);
51     star.x=sx--;
52     star.y=sy--;
53     BFS();
54     printf("%d\n",day);
55     return 0;
56 }

TYVJ 1030 乳草的入侵(BFS),布布扣,bubuko.com

时间: 2024-11-19 06:50:59

TYVJ 1030 乳草的入侵(BFS)的相关文章

Tyvj 1030 乳草的入侵

以一个简单的BFS对基础搜索做一个收尾好了. 给一个草,然后以这棵草为九宫格的中心,每周向周围八个方向扩散,问多少个星期能把这个农场占满. 遍历整个map,最后一个出队列的对应的星期数就是所求. 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 using namespace std; 7 8 struct

乳草的入侵//BFS

P1030 乳草的入侵 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 USACO OCT09 6TH 描述 Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份佔领了一片立足之地. 草地像往常一样,被分割成一个高度為Y(1 <= y <= 100), 宽度為X(1 <= x <= 100)的直角网格.(1,1)是左下角的格(也就是说坐标排布跟一

TYVJ P1030 乳草的入侵 Label:靠输入方式坑人的水,跳马问题

背景 USACO OCT09 6TH 描述 Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物大战人类中败下阵来.邪恶的乳草已经在他的农场的西北部份佔领了一片立足之地. 草地像往常一样,被分割成一个高度為Y(1 <= y <= 100), 宽度為X(1 <= x <= 100)的直角网格.(1,1)是左下角的格(也就是说坐标排布跟一般的X,Y坐标相同).乳草一开始佔领了格(Mx,My).每个星期,乳草传播到已被乳草佔领的格子四面八方的每一

BZOJ 3406 乳草的入侵

BFS. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define maxn 150 using namespace std; queue <int> q; int n,m,mx,my,map[maxn][maxn]; int dx[]={0,-1,-1,-1,0,1,1,1,0},dy[]={0,

TYVJ 1074 武士风度的牛(BFS)

背景 Background 农民John有很多牛,他想交易其中一头被Don称为The Knight的牛.这头牛有一个独一无二的超能力,在农场里像Knight一样地跳(就是我们熟悉的象棋中马的走法).虽然这头神奇的牛不能跳到树上和石头上,但是它可以在牧场上随意跳,我们把牧场用一个x,y的坐标图来表示. 描述 Description 这头神奇的牛像其它牛一样喜欢吃草,给你一张地图,上面标注了The Knight的开始位置,树.灌木.石头以及其它障碍的位置,除此之外还有一捆草.现在你的任务是,确定Th

TYVJ P1083 分糖果 Label:bfs

描述 童年的我们,将和朋友分享美好的事物作为自己的快乐.这天,C小朋友得到了Plenty of candies,将要把这些糖果分给要好的朋友们.已知糖果从一个人传给另一个人需要1 秒的时间,同一个小朋友不会重复接受糖果.由于糖果足够多,如果某时刻某小朋友接受了糖果,他会将糖果分成若干份,分给那些在他身旁且还没有得到糖果的小朋友们,而且自己会吃一些糖果.由于嘴馋,小朋友们等不及将糖果发完,会在得到糖果后边吃边发.每个小朋友从接受糖果到吃完糖果需要m秒的时间.那么,如果第一秒C小朋友开始发糖,第多少

搜索算法阶段性总结

BFS与DFS的讨论:BFS:这是一种基于队列这种数据结构的搜索方式,它的特点是由每一个状态可以扩展出许多状态,然后再以此扩展,直到找到目标状态或者队列中头尾指针相遇,即队列中所有状态都已处理完毕. DFS:基于递归的搜索方式,它的特点是由一个状态拓展一个状态,然后不停拓展,直到找到目标或者无法继续拓展结束一个状态的递归. 优缺点:BFS:对于解决最短或最少问题特别有效,而且寻找深度小,但缺点是内存耗费量大(需要开大量的数组单元用来存储状态). DFS:对于解决遍历和求所有问题有效,对于问题搜索

广度优先搜索基础

一.广搜的特性(队列状态之特性) 当使用BFS遍历一张无权图,每次从队列中取出队首进行一系列扩展,将扩展成功结点放入队尾中: 这样的操作会使得整队列满足"两段性",即对于这张搜索树中队列只会保留两层的结点: 证明: 第p层结点扩展时只会扩展第p+1层结点,不会越级扩展p+k层结点(p >= 1&&k >= 2): 初始的时候队列中只有一层的结点(或者起始点): 一+二推得:该队列只保留了不超过两层的结点: 由于是"两段性",而从起始点到达

中英目录所有2719品种

中英目录 A B C D E F G H I J K L M N O P Q RS T U V W X Y Z 中英目录所有2719品种 阿比西尼亚牛筋果  Abyssinia Harrisonia 阿尔法GPC  Alpha GPC α-酮戊二酸  Alpha-Ketoglutarate α- 亚麻酸  Alpha -Linolenic Acid 阿尔泰银莲花  Creeping Chinese Windflower 阿富汗糖芥  Afghan Erysimum 阿拉伯茶  Arabian T