zoukankan      html  css  js  c++  java
  • 洛谷 P3456 [POI2007]GRZ-Ridges and Valleys

    题意翻译

    给定一个地图,为小朋友想要旅行的区域,地图被分为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’(山谷)。

    你的任务是,对于给定的地图,求出山峰和山谷的数量,如果所有格子都有相同的高度,那么整个地图即是山峰,又是山谷。

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

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

    感谢@Blizzard 提供的翻译

    题目描述

    Byteasar loves trekking in the hills. During the hikes he explores all the ridges and valleys in vicinity.

    Therefore, in order to plan the journey and know how long it will last, he must know the number of ridgesand valleys in the area he is going to visit. And you are to help Byteasar.

    Byteasar has provided you with a map of the area of his very next expedition. The map is in the shape ofa n imes nn×nsquare. For each field (i,j)(i,j) belonging to the square(for i,jin {1,cdots,n}i,j{1,,n} ), its height w_{(i,j)}w(i,j) is given.

    We say two fields are adjacent if they have a common side or a common vertex (i.e. the field (i,j)(i,j) is adjacent to the fields (i-1,j-1)(i1,j1) , (i-1,j)(i1,j) , (i-1,j+1)(i1,j+1) , (i,j-1)(i,j1) , (i,j+1)(i,j+1) , (i+1,j-1)(i+1,j1) , (i+1,j)(i+1,j) , (i+1,j+1)(i+1,j+1) , provided that these fields are on the map).

    We say a set of fields SS forms a ridge (valley) if:

    all the fields in SS have the same height,the set SS forms a connected part of the map (i.e. from any field in SS it is possible to reach any other field in SS while moving only between adjacent fields and without leaving the set SS ),if sin SsS and the field s' otin SsS is adjacent to ss , then w_s>w_{s'}ws>ws (for a ridge) or w_s<w_{s'}ws<ws (for a valley).

    In particular, if all the fields on the map have the same height, they form both a ridge and a valley.

    Your task is to determine the number of ridges and valleys for the landscape described by the map.

    TaskWrite a programme that:

    reads from the standard input the description of the map, determines the number of ridges and valleys for the landscape described by this map, writes out the outcome to the standard output.

    给定一张地势图,求山峰和山谷的数量

    输入输出格式

    输入格式:

     

    In the first line of the standard input there is one integer nn ( 2le nle 1 0002n1 000 )denoting the size of the map. Ineach of the following nn lines there is the description of the successive row of the map. In (i+1)(i+1) 'th line(for iin {1,cdots,n}i{1,,n} ) there are nn integers w_{(i,1)},cdots,w_{(i,n)}w(i,1),,w(i,n) ( 0le w_ile 1 000 000 0000wi1 000 000 000 ), separated by single spaces. Thesedenote the heights of the successive fields of the ii 'th row of the map.

     

    输出格式:

     

    The first and only line of the standard output should contain two integers separated by a single space -thenumber of ridges followed by the number of valleys for the landscape described by the map.

     

    输入输出样例

    输入样例#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
    输出样例#1: 复制
    2 1
    思路:水题,没看见上面两句话,炸了两次,gg;
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,ans,bns,flag,hg;
    int map[1010][1010],vis[1010][1010];
    void dfs(int x,int y,int col){
        if(x<1||x>n||y<1||y>n)    return ;
        if(map[x][y]!=col&&map[x][y]>col&&flag==0)    flag++;
        else if(map[x][y]!=col&&map[x][y]<col&&flag==0)    flag--;
        else if(map[x][y]!=col&&map[x][y]>col&&flag<0)    hg=1;
        else if(map[x][y]!=col&&map[x][y]<col&&flag>0)    hg=1;    
        if(map[x][y]!=col||vis[x][y])    return ;
        vis[x][y]=1;
        dfs(x+1,y,col);dfs(x-1,y,col);dfs(x+1,y+1,col);dfs(x-1,y-1,col);
        dfs(x,y+1,col);dfs(x,y-1,col);dfs(x+1,y-1,col);dfs(x-1,y+1,col);
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&map[i][j]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(!vis[i][j]){
                    flag=0;hg=0;
                    dfs(i,j,map[i][j]);
                    if(hg==0&&flag<=0)    ans++;
                    if(hg==0&&flag>=0)    bns++;
                }
        cout<<ans<<" "<<bns;
    }
     
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    ssm 在不同的数据库中进行切换(开启事物禁用)
    引入xfire-all.jar后导致sping配置异常
    单点登录cas的最简单使用
    win10下cmd命令不能用
    前端json 两个重要的方法
    maven 工程下第三方jar 包的引入和打包 war
    idea 中main 方法不能运行
    从sqlServer 分页查询谈${}和#{}
    can与could区别
    线程同步与异步区别
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/9334778.html
Copyright © 2011-2022 走看看