zoukankan      html  css  js  c++  java
  • 台风

    题目:

    天气预报频道每天从卫星上接受卫星云图。图片被看作是一个矩阵,每个位置上要么是”#”,要么”.”,”#”表示该位置没有云,”.”表示有云,地图上每个位置有多达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 }
  • 相关阅读:
    【学习笔记 2】单调队列 & 单调栈
    【学习笔记 1】快速幂
    题解P1151
    题解 P6161【[Cnoi2020]高维】
    不知道叫啥的题目1
    神秘题目1
    5.30 模拟赛赛后总结
    矩阵乘法加速图上问题专题总结
    点分治&点分树 复习
    5.26赛后总结
  • 原文地址:https://www.cnblogs.com/ouzijun-OJ/p/11389502.html
Copyright © 2011-2022 走看看