• 【bfs】BZOJ1102- [POI2007]山峰和山谷Grz


    最后刷个水,睡觉去。Bless All!

    【题目大意】

    给定一个地图,为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’(山谷)。
    你的任务是,对于给定的地图,求出山峰和山谷的数量,如果所有格子都有相同的高度,那么整个地图即是山峰,又是山谷。

    【思路】

    普通的bfs。判断是否是山峰和山谷的方法就是如果周围和它们不等高,那么就记下比它们高还是比它们低。最后如果统一高,就是山谷;统一低,就是山峰。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int MAXN=1000+5;
     4 int w[MAXN][MAXN],vis[MAXN][MAXN];
     5 int peak,valley,higher,lower,n;
     6 int dx[8]={1,1,1,-1,-1,-1,0,0};
     7 int dy[8]={0,1,-1,0,1,-1,1,-1};
     8 struct node
     9 {
    10     int x,y;
    11 };
    12 queue<node> que;
    13 
    14 void init()
    15 {
    16     peak=valley=0;
    17     scanf("%d",&n);
    18     for (int i=1;i<=n;i++)
    19         for (int j=1;j<=n;j++) scanf("%d",&w[i][j]);
    20 }
    21 
    22 void bfs(int x,int y)
    23 {
    24     lower=higher=0;
    25     while (!que.empty()) que.pop();
    26     que.push((node){x,y});
    27     vis[x][y]=1;
    28     while (!que.empty())
    29     {
    30         int hx=que.front().x,hy=que.front().y;
    31         que.pop();
    32         for (int i=0;i<8;i++)
    33         {
    34             int xx=hx+dx[i],yy=hy+dy[i];
    35             if (xx<=0 || xx>n || yy<=0 || yy>n) continue;
    36             if (w[xx][yy]==w[hx][hy] && !vis[xx][yy])
    37             {
    38                 que.push((node){xx,yy});
    39                 vis[xx][yy]=1;
    40             }
    41             else
    42             {
    43                 if (w[xx][yy]>w[hx][hy]) higher++;
    44                     else if (w[xx][yy]<w[hx][hy]) lower++;
    45             }
    46         } 
    47     } 
    48     if (higher==0 && lower!=0) peak++;
    49     if (lower==0 && higher!=0) valley++; 
    50 }
    51 
    52 void solve()
    53 {
    54     memset(vis,0,sizeof(vis));
    55     for (int i=1;i<=n;i++)
    56         for (int j=1;j<=n;j++)
    57             if (!vis[i][j]) bfs(i,j);
    58     if (!peak && !valley) peak=valley=1;
    59     printf("%d %d
    ",peak,valley);
    60 }
    61 
    62 int main()
    63 {
    64     init();
    65     solve();
    66     return 0;
    67 } 
  • 相关阅读:
    appium 3-4-1034等待、日志、性能数据、xpath定位、web driver协议
    appium 3-31626 toast识别
    appium 3-31603调试分析方法
    java-appium-527 WebDriver协议&针对控件的操作
    java-appium-527进阶-1 UiAutomator1&2区别和封装
    python-appium520-2初步使用
    python-appium520-3引入unittest,编写自动化用例
    Android手机卸载第三方应用
    grub名词理解
    基于ubuntu和windows连接
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/6079295.html
Copyright © 2020-2023  润新知