acwing1106. 山峰和山谷(宽搜bfs)「建议收藏」

acwing1106. 山峰和山谷(宽搜bfs)「建议收藏」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 为山峰(山谷)当且仅当:

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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 为山峰(山谷)当且仅当:

S 的所有格子都有相同的高度。
S 的所有格子都连通。
对于 s 属于 S,与 s 相邻的 s′ 不属于 S,都有 ws>ws′(山峰),或者 ws<ws′(山谷)。
如果周围不存在相邻区域,则同时将其视为山峰和山谷。
你的任务是,对于给定的地图,求出山峰和山谷的数量,如果所有格子都有相同的高度,那么整个地图即是山峰,又是山谷。

输入格式
第一行包含一个正整数 n,表示地图的大小。

接下来一个 n×n 的矩阵,表示地图上每个格子的高度 w。

输出格式
共一行,包含两个整数,表示山峰和山谷的数量。

数据范围
1≤n≤1000,
0≤w≤109
输入样例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
输入样例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
输出样例2:
3 3
样例解释
样例1:

1.png

样例2:

2.png
题解
bfs

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int>PII;
const int N = 1e3 + 10;
int g[N][N],vis[N][N];
    int n;
PII q[N * N ];
int hh = 0,tt = 0;
int dx[8] = { 
   -1,0,1,1,1,0,-1,-1},dy[8] = { 
   -1,-1,-1,0,1,1,1,0};
int bfs(int x,int y){ 
   
    bool ispeak = true,islow = true;
    hh = 0,tt = 0;
    q[tt ++] = { 
   x,y};
    vis[x][y] = true;
    while(hh < tt){ 
   
        PII t = q[hh ++];
        for(int k = 0;k < 8;k ++){ 
   
            int a = t.x + dx[k],b = t.y + dy[k];
            if(a < 0 || a >= n || b < 0 || b >= n)continue;
            int key = g[t.x][t.y];
            if(key < g[a][b])ispeak = false;
            else if(key > g[a][b])islow = false;
            else if(!vis[a][b]){ 
   
                vis[a][b] = true;
                q[tt ++] = { 
   a,b};
            }
        }
    }
    
    if(ispeak && !islow)return 1;
    else if(islow && !ispeak)return 0;
    else if(ispeak && islow)return -1;
    else return -2;
}
int main(){ 
   
    cin>>n;
    for(int i = 0;i < n;i ++){ 
   
        for(int j = 0;j < n;j ++){ 
   
            cin>>g[i][j];
        }
    }
    int ispeak = 0,islow = 0;
    for(int i = 0;i < n;i ++){ 
   
        for(int j = 0;j < n;j ++){ 
   
            if(!vis[i][j]){ 
   
                int t = bfs(i,j);
                if(t == 1)ispeak ++;
                else if(t == 0)islow ++;
                else if(t == -1)ispeak ++,islow ++;
            }
        }
    }
    cout<<ispeak<<" "<<islow<<endl;
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169141.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月9日 下午10:00
下一篇 2022年8月9日 下午10:16


相关推荐

  • CSS实用技巧:伪元素/伪类的妙用

    CSS实用技巧:伪元素/伪类的妙用在一个网页中 CSS 占着非常重要的地位 近年来随着 CSS 的发展 伪元素 伪类也开始被大量应用 在性能愈加被看中的当下 处于文档流之外的 CSS 伪元素 伪类是当之无愧的 无冕之王 下面笔者总结的一些关于 CSS 的 骚操作 希望能对你产生帮助 hover 和 focus 显示浮层我们完全可以只用 CSS 的父子选择器 用于 父子嵌套 兄弟选择器 用于 同级并列排列 伪类 hover 实现 当鼠标滑入显示 xxx 甚至不用 JS 比如 当鼠标滑入链接时显示图片

    2026年3月19日
    2
  • 30B规格新标杆!智谱AI开源GLM-4.7-Flash,多项测试力压阿里OpenAI

    30B规格新标杆!智谱AI开源GLM-4.7-Flash,多项测试力压阿里OpenAI

    2026年3月12日
    1
  • 3分钟学习下射频放大器基础知识

    其实很多筒子都想看放大器相关的东西,射频君一直很头疼这个题目。毕竟是比较复杂的器件,其实写起来也是很困难的。今天就来跟大家唠唠放大器相关的基础知识,抛砖引玉哈。射频放大器,根本上是我们射频系统中的正反馈系统,一般位于发射链路上。由于考虑无线传输的链路衰减,发射端需要辐射足够大的功率才能获得比较远的通信距离。因此,射频放大器主要负责将功率放大到足够大后馈送到天线上辐射出去,是通信系统中的核心器件…

    2022年4月6日
    38
  • Cas单点登录常见问题总结

    Cas单点登录常见问题总结1、访问客户端地址不跳转到cas-server认证界面。因为我没有进入后台,localhost:8010/abc才是后台项目。访问localhost:8010进入的是前端项目,不进入cas的过滤器。2、认证成功之后,还是进不去客户端子系统。认证成功后,卡在了前端登录界面,就是进不去。3、加入Cas配置,但是不生效。首先,找几个简单的具备登录功能的项目,测试一下是否可以单点登录,判断是否是自己操作有误。如果没有错误,那就是项目本身问题,对项目本身了解不够透彻。jar包问题?换cas-serve

    2022年5月18日
    83
  • 雷军反击董明珠:感觉董总好像认输了似的

    雷军反击董明珠:感觉董总好像认输了似的

    2022年2月5日
    46
  • idea控制台乱码解决办法

    idea控制台乱码解决办法IDEA 控制台乱码问题文章目录 IDEA 控制台乱码问题为了节省大家时间 直接展示下我的编码配置方案我的编码配置原则我的编码配置另外说一下几个重要但是和乱码无关的配置乱码原因解决方式我为什么推荐控制台使用 GBK 我的编码设置思想第一种解决方案的弊端 end 附加技巧如何找出具体乱码原因

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号