zoukankan      html  css  js  c++  java
  • LOJ P2653 山峰和山谷 Ridges and Valleys 题解

    每日一题 day70 打卡

    Analysis

    这道题的突破口是每个山峰或山谷上的高度是相同的,根据这点我们就可以用广搜来解决。

    这样我们基本的思路就是广搜从每个点开始,搜它能走到的高度相同的格子,且将它标记为走过,这样我们就可以在时间范围内遍历整个图了。

    但是如何判断当前遍历的连通块是否是山峰还是山谷呢?(要知道并不是每一个连通块都是山峰或山谷)

    我们可以通过当前遍历的且是非当前连通块的点与连通块高度比较,连通块高度高则有可能是山峰,反之亦然。

    只有这个也不能确定,我们需要在广搜后再加一个判断,如果搜完的连通块既有可能是山峰,也有可能是山谷,那它既不是山峰,也不是山谷。

    以下是代码实现:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<queue>
     6 #define int long long
     7 #define maxn 1010
     8 #define rep(i,s,e) for(register int i=s;i<=e;++i)
     9 #define dwn(i,s,e) for(register int i=s;i>=e;--i)
    10 using namespace std;
    11 inline int read()
    12 {
    13     int x=0,f=1;
    14     char c=getchar();
    15     while(c<'0'||c>'9') {if(c=='-') x=-x; c=getchar();}
    16     while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();}
    17     return f*x;
    18 }
    19 inline void write(int x)
    20 {
    21     if(x<0){putchar('-');x=-x;}
    22     if(x>9)write(x/10);
    23     putchar(x%10+'0');
    24 }
    25 int n,ans1,ans2;
    26 int map[maxn][maxn];
    27 int book[maxn][maxn];
    28 int dx[10]={0,0,0,1,-1,1,1,-1,-1},dy[10]={0,1,-1,0,0,1,-1,1,-1};
    29 struct node
    30 {
    31     int x,y;
    32 }point[maxn];
    33 queue<node> q;
    34 void bfs(int sx,int sy) 
    35 {
    36     int flag1=0,flag2=0;
    37     q.push((node){sx,sy});
    38     while(!q.empty())
    39     {
    40         node now=q.front();
    41         q.pop();
    42         rep(i,1,8)
    43         {
    44             node af;
    45             af.x=now.x+dx[i];
    46             af.y=now.y+dy[i];
    47             if(af.x<1||af.y<1||af.x>n||af.y>n) continue;
    48             if(book[af.x][af.y]==0&&map[sx][sy]==map[af.x][af.y])
    49             {
    50                 book[af.x][af.y]=1;
    51                 q.push(af);
    52             }
    53             else if(map[sx][sy]>map[af.x][af.y]) flag1=1;
    54             else if(map[sx][sy]<map[af.x][af.y]) flag2=1;
    55         }
    56     }
    57     if(flag1==1&&flag2==0) ++ans1;
    58     if(flag2==1&&flag1==0) ++ans2;
    59 }
    60 signed main()
    61 {
    62     n=read();
    63     rep(i,1,n)
    64         rep(j,1,n)
    65             map[i][j]=read();
    66     int s=map[1][1],cnt=0;
    67     rep(i,1,n)
    68         rep(j,1,n)
    69             if(map[i][j]==s) ++cnt;
    70     if(cnt==n*n)
    71     {
    72         write(1);
    73         putchar(' ');
    74         write(1);
    75         return 0;
    76     }
    77     rep(i,1,n)
    78         rep(j,1,n)
    79             if(book[i][j]==0)
    80                 bfs(i,j);
    81     write(ans1);
    82     putchar(' ');
    83     write(ans2);
    84     return 0;
    85 }

    如有失误请各位大佬斧正(反正我不认识斧正是什么意思)

  • 相关阅读:
    Path类的最全面具体解释
    数据挖掘之分类算法---knn算法(有matlab样例)
    Android View框架的measure机制
    2017年本博客知识体系引导(更新至2017.8.11)
    [DevExpress]DevExpress 中 汉化包 汉化方法
    盗墓笔记第一季全(12集)下载地址
    浅谈spring——注解配置(九)
    git使用系列(一)
    算法与数据结构(一)
    phpstrom 2016.2 注册服务器地址
  • 原文地址:https://www.cnblogs.com/handsome-zyc/p/12381639.html
Copyright © 2011-2022 走看看