JZOJ.2117. 【2016-12-30普及组模拟】台风

题目大意:

  天气预报频道每天从卫星上接受卫星云图。图片被看作是一个矩阵,每个位置上要么是”#”,要么”.”,”#”表示该位置没有云,”.”表示有云,地图上每个位置有多达8个相邻位置,分别是,左上、上、右上、左、右、左下、下、右下8个方向,一块云是由连续的”.”组成。
例如:下面的卫星云图有4块云:

#####.#####

####.####.#

###..##.#.#

##...######

######.....

###########

如果当云的大小大于等于4的时候会产生台风,那么上图有将会产生2个台风,分别用1和2表示:

#####1#####

####1####.#

###11##.#.#

##111######

######22222

###########

给你一幅卫星云图和形成台风所需云的大小,要你计算出有几个台风以及最大台风的大小。我们用云的大小表示台风的大小。

 

一波解析:

  

从上到小从左到右扫描卫星云图,如果某位置(a[i,j]=’.’)and(f[i,j]=false),则从(i,j)出发进行FllodFill,把所有和它相连的位置全部更新为True,同时记录数量num,其他操作比较简单,就不用说了。

 

ALL IN ALL 就是一句话:白~~~~~番~~~~~薯(bfs)

 

code

  

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int n,m;
 7 char map[1001][1001];
 8 int cnt;
 9 int ans;
10 int maxn=-1;
11 int k;
12 int hx[10000010];
13 int hxx[1000010];
14 int dx[8]= {1,0,-1,0,1,-1,1,-1};
15 int dy[8]= {0,1,0,-1,1,1,-1,-1};
16 void bfs(int x,int y) {//白番薯 
17     int head=0;
18     int tail=1;
19     hx[tail]=x;
20     hxx[tail]=y;
21     do 
22     {
23         head++;
24         for(int i=0; i<8; i++) 
25         {
26             int nx=hx[head]+dx[i];
27             int ny=hxx[head]+dy[i];
28             if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&map[nx][ny]=='.') 
29             {
30                 tail++;
31                 hx[tail]=nx;
32                 hxx[tail]=ny;
33                 map[nx][ny]='#';
34                 cnt++;
35             }
36         }
37     } while(head<tail);
38 }
39 int main() 
40 {
41     freopen("storm.in","r",stdin);
42     freopen("storm.out","w",stdout);
43     cin>>n>>m;
44     for(int i=1; i<=n; i++)
45     {
46         for(int j=1; j<=m; j++)
47         {
48             cin>>map[i][j];
49         }
50     }
51     cin>>k;
52     for(int i=1; i<=n; i++) 
53     {
54         for(int j=1; j<=m; j++) 
55         {
56             if(map[i][j]=='.') 
57             {
58                 cnt=0;
59                 bfs(i,j);
60                 if(cnt>=k) 
61                 {
62                     ans++;
63                     maxn=max(maxn,cnt);
64                 }
65             }
66         }
67     }
68     cout<<ans<<" "<<maxn;
69     return 0;
70 }//bird bird 牛逼!!

 

转载于:https://www.cnblogs.com/WestJackson/p/11388579.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值