• bzoj1102[POI2007]山峰和山谷Grz


    Description

    FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷。为了能够让他对他的旅程有一个安排,他想知道山峰和山谷的数量。给定一个地图,为FGD想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w( i,j)是给定的。若两个格子有公共顶点,那么他们就是相邻的格子。(所以与(i,j)相邻的格子有(i-1, j-1),(i-1 ,j),(i-1,j+1),(i,j-1),(i,j+1),(i+1,j-1),(i+1,j),(i+1,j+1))。我们定义一个格子的集合S为山峰(山谷)当且仅当:1.S的所有格子都有相同的高度。2.S的所有格子都联通3.对于s属于S,与s相邻的s’不属于S。都有ws > ws’(山峰),或者ws < ws’(山谷)。你的任务是,对于给定的地图,求出山峰和山谷的数量,如果所有格子都有相同的高度,那么整个地图即是山峰,又是山谷。

    Input   

    第一行包含一个正整数n,表示地图的大小(1<=n<=1000)。接下来一个n*n的矩阵,表示地图上每个格子的高 度。(0<=w<=1000000000)

    Output   

    应包含两个数,分别表示山峰和山谷的数量。

    Sample Input

    输入样例1

    5

    8 8 8 7 7

    7 7 8 8 7

    7 7 7 7 7

    7 8 8 7 8

    7 8 8 8 8

    输入样例2

    5

    5 7 8 3 1

    5 5 7 6 6

    6 6 6 2 8

    5 7 2 5 8

    7 1 0 1 7

    Sample Output

    输出样例1

    2 1

    输出样例2

    3 3

    HINT

     这道题写的我非(心)常(态)nice(boom) 其实很简单,但是sb的我为了追求效率,去写bfs企图一遍找出所有的山峰山谷,当我死循环了无数遍,

    要么就是标记的数量不对。 最后只能退而求其次,打了个暴力枚举+dfs 枚举每个点所在的地理位置,判断是否是山谷和山峰,累加答案 其实也不是很慢,

    但是和bfs比起来慢多了 别忘了特判 希望有仁兄会bfs写此题,给予一些指导

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 int n,mp[1002][1002],a,b,vis[1002][1002],now=0;
     5 int dx[8]={-1,-1,-1,0,0,1,1,1},dy[8]={-1,0,1,-1,1,-1,0,1};
     6 void dfs(int x,int y,int l,int r)
     7 {
     8     if(vis[x][y]==mp[l][r])return ;
     9     vis[x][y]=mp[l][r];
    10     for(int k=0;k<8;k++)
    11         {
    12             int sx=x+dx[k],sy=y+dy[k];
    13             if(sx<1||sx>n||sy<1||sy>n)continue;
    14             if(mp[sx][sy]==mp[l][r])dfs(sx,sy,l,r);
    15             else if(mp[sx][sy]>mp[l][r])a=1;
    16             else b=1;
    17         }
    18 }
    19 int main()
    20 {
    21     scanf("%d",&n);
    22     for(int i=1;i<=n;i++)
    23         for(int j=1;j<=n;j++)
    24             {
    25                 scanf("%d",&mp[i][j]);
    26                 if(mp[i][j]==mp[1][1])now++;
    27             }
    28     if(now==n*n){printf("1 1
    ");return 0;}
    29     for(int i=1;i<=n;i++)
    30         for(int j=1;j<=n;j++)
    31             vis[i][j]=-1;
    32     int ans1=0,ans=0;
    33     for(int i=1;i<=n;i++)
    34         for(int j=1;j<=n;j++)
    35             {
    36                 dfs(i,j,i,j);
    37                 if(a&&!b)ans++;
    38                 if(!a&&b)ans1++;
    39                 a=0,b=0;
    40             }
    41     printf("%d %d
    ",ans1,ans);
    42 }

     

  • 相关阅读:
    【文章阅读】计算机体系-计算机将代码编译和持续运行过程中需要考虑的问题,以及具体的实现原理讲解
    JAVA性能调试+JProfiler使用相关
    【2016.10.30】王国保卫战-安卓汉化版
    【2017.01.05】装系统教程
    【2016.11.10】百度云离线下载迅雷链接
    mongodb 杂记
    缓存使用思路
    分布式 vs 集群
    切面 aop 笔记
    前端
  • 原文地址:https://www.cnblogs.com/lcxer/p/9441442.html
Copyright © 2020-2023  润新知