台风

题目:

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

#####.#####
####.####.#
###..##.#.#
##...######
######.....
###########

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

#####1#####
####1####.#
###11##.#.#
##111######
######22222
###########

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

分析:

简单,枚举每一个点,假如是‘.’,那么进行宽搜,向八个方向扩展,加入队列,更新为‘#’。

再判断是否大于k.......

操作十分简单,AC。

code:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,m,k;
 7 int sum;
 8 int ans;
 9 int maxn=-999;
10 char a[1001][1001];
11 int ax[1000000];
12 int ay[1000000];
13 void bfs(int x,int y) {
14     int head=0;
15     int tail=1;
16     ax[tail]=x;
17     ay[tail]=y;
18     int dx[8]= {1,0,-1,0,1,-1,1,-1};
19     int dy[8]= {0,1,0,-1,1,1,-1,-1};
20     do {
21         head++;
22         for(int i=0; i<8; i++) {
23             int nx=ax[head]+dx[i];
24             int ny=ay[head]+dy[i];
25             if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]=='.') {
26                 tail++;
27                 ax[tail]=nx;
28                 ay[tail]=ny;
29                 a[nx][ny]='#';
30                 sum++;
31             }
32         }
33     } while(head<tail);
34 }
35 int main() {
36     freopen("storm.in","r",stdin);
37     freopen("storm.out","w",stdout);
38     scanf("%d%d",&n,&m);
39     for(int i=1; i<=n; i++)
40         for(int j=1; j<=m; j++)
41             cin>>a[i][j];
42     scanf("%d",&k);
43     for(int i=1; i<=n; i++) {
44         for(int j=1; j<=m; j++) {
45             if(a[i][j]=='.') {
46                 sum=0;
47                 bfs(i,j);
48                 if(sum>=k) {
49                     ans++;
50                     maxn=max(maxn,sum);
51                 }
52             }
53         }
54     }
55     printf("%d %d",ans,maxn);
56     return 0;
57 }

 

posted @ 2019-08-21 16:27  とある科学の超电磁炮  阅读(140)  评论(0编辑  收藏  举报