P3456 [POI2007] GRZ-Ridges and Valleys BFS-连通块思想

题目描述

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×nn×n square. For each field (i,j)(i,j) belonging to the square(for i,j∈{1,⋯ ,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)(i−1,j−1),(i−1,j)(i−1,j),(i−1,j+1)(i−1,j+1),(i,j−1)(i,j−1),(i,j+1)(i,j+1),(i+1,j−1)(i+1,j−1),(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 s∈Ss∈S and the field s′∉Ss′∈/S is adjacent to ss, then ws>ws′ws​>ws′​(for a ridge) or ws<ws′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 (2≤n≤1 0002≤n≤1 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 i∈{1,⋯ ,n}i∈{1,⋯,n}) there are nn integers w(i,1),⋯ ,w(i,n)w(i,1)​,⋯,w(i,n)​(0≤wi≤1 000 000 0000≤wi​≤1 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.

题意翻译

题目描述

译自 POI 2007 Stage 2. Day 0「Ridges and Valleys」

给定一个 n×n 的网格状地图,每个方格 (i,j)(i,j) 有一个高度 wij。如果两个方格有公共顶点,则它们是相邻的。

定义山峰和山谷如下:

  • 均由地图上的一个连通块组成;
  • 所有方格高度都相同;
  • 周围的方格(即不属于山峰或山谷但与山峰或山谷相邻的格子)高度均大于山谷的高度,或小于山峰的高度。

求地图内山峰和山谷的数量。特别地,如果整个地图方格的高度均相同,则整个地图既是一个山谷,也是一个山峰。

输入格式

第一行一个整数 n (2≤n≤1000),表示地图的大小。

接下来 n 行每行 n 个整数表示地图。第 ii行有 n 个整数 wi1,wi2,…,win(0≤wij≤1 000 000 000),表示地图第 ii 行格子的高度。

输出格式

输出一行两个整数,分别表示山峰和山谷的数量。

样例解释

翻译来自于 LibreOJ。

输入输出样例

输入 #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
#include<iostream>
#include<cstring>
#include<algorithm>#define x first
#define y secondusing namespace std;typedef pair<int,int> PII;
const int N =1000+100;
int h[N][N]; 
bool cnt[N][N];
PII q[N*N];int n;/*** @brief 广度优先搜索 (BFS) 函数,用于遍历矩阵中的相邻元素。* * 该函数从给定的起始坐标 (x, y) 开始,检查其周围的 8 个相邻位置,* 判断是否存在比当前高度更高的点或更低的点,并更新 has_higher 和 has_lower 标志。* 如果存在相同高度的未访问点,则继续扩展搜索。* * @param x 起始坐标的行索引* @param y 起始坐标的列索引* @param has_higher 是否存在比当前高度更高的点* @param has_lower 是否存在比当前高度更低的点*/
void bfs(int x, int y, bool &has_higher, bool &has_lower)
{int hh = 0, tt = 0;q[0] = {x, y};cnt[x][y] = true;// BFS 遍历队列中的所有节点while (hh <= tt){PII t = q[hh++];// 遍历当前节点的 8 个相邻位置for (int i = t.x - 1; i <= t.x + 1; i++){for (int j = t.y - 1; j <= t.y + 1; j++){// 检查边界条件,防止越界if (i < 0 || j < 0 || i >= n || j >= n) continue;// 如果相邻点的高度不同,更新 has_higher 和 has_lower 标志if (h[i][j] != h[t.x][t.y]){if (h[i][j] > h[t.x][t.y]) has_higher = true;else if (h[i][j] < h[t.x][t.y]) has_lower = true;}// 如果相邻点的高度相同且未访问过,加入队列继续搜索else if (!cnt[i][j]){cnt[i][j] = true;q[++tt] = {i, j};}}}}
}int main()
{// 输入矩阵大小 nscanf("%d", &n);// 输入矩阵 h 的值for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){scanf("%d", &h[i][j]);}}int peak = 0;int val = 0;// 遍历矩阵中的每个点,使用 BFS 判断是否为山顶或山谷for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (!cnt[i][j]){bool has_higher = false, has_lower = false;bfs(i, j, has_higher, has_lower);// 如果没有更高的点,则为山顶if (!has_higher) peak++;// 如果没有更低的点,则为山谷if (!has_lower) val++;}}}// 输出山顶和山谷的数量cout << peak << " " << val << endl;return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/65070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一键打断线(根据相交点打断)——CAD c# 二次开发

多条相交线根据交点一键打断&#xff0c;如下图&#xff1a; 部分代码如下: finally namespace IFoxDemo; public class Class1 {[CommandMethod("ddx")]public static void Demo(){//"ifox可以了".Print();Database db HostApplicationServices.Workin…

【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?

文章目录 前言问题描述问题分析问题解决1.允许所有用户上传驱动文件2.如果是想只上传白名单的驱动 前言 该方法适合永洪BI系列产品&#xff0c;包括不限于vividime desktop&#xff0c;vividime z-suit&#xff0c;vividime x-suit产品。 问题描述 当我们连接数据源的时候&a…

基于云计算的资源管理系统

基于云计算的资源管理系统是一种将云计算技术与资源管理技术相结合&#xff0c;以实现资源高效利用和管理的系统。以下是对该系统的详细分析&#xff1a; 一、系统概述 云计算是一种基于网络的计算模式&#xff0c;通过将计算资源和数据存储在云端服务器上&#xff0c;使用户…

在Windows11上编译C#的实现Mono的步骤

在Windows11上编译Mono的步骤 1、 在win11打开开发者模式,在更新和安全选项里,如下图: 2、下载并安装64位的cygwin, 下载网站:www.cygwin.com 3、 安装 Visual Studio 2015 or later 的社区版本。 4、 下载Mono的windows最新版本。 5、 在cmd.exe里运行下面的命令来安…

VBA实现遍历Excel文件将指定的单元格内容拷贝到当前工作簿

选择一个文件夹&#xff0c;遍历其中所有Excel文件&#xff0c;并将每个文件指定的单元格内容拷贝到当前工作簿的目标区域。 Sub 遍历文件拷贝指定区域内容()Dim folderPath As StringDim fileName As StringDim sourceColumns As StringDim targetRow As LongDim wbSource As…

C++中的类继承知识点总结1(13章)

一&#xff09;类继承总结 继承通过使用已有的类(基类)定义新的类(派生类)&#xff0c;使得能够根据需要修改编程代码。公有继承建立 is-a关系&#xff0c;这意味着派生类对象也应该是某种基类对象。作为is-a模型的一部分&#xff0c;派生类继承基类的数据成员和大部分方法&…

某家政小程序系统 httpRequest 任意文件读取

0x01 产品描述: ‌家政上门预约服务小程序‌是一种基于移动互联网的家政服务平台,旨在为用户提供便捷、高效、安全的家政服务。用户可以通过手机随时随地预约家政服务,满足家庭日常清洁、照料、维修等需求‌。0x02 漏洞描述: 家政小程序系统 httpRequest 接口存在任意文件读…

《探索 Apache Spark MLlib 与 Java 结合的卓越之道》

在当今大数据与人工智能蓬勃发展的时代&#xff0c;Apache Spark MLlib 作为强大的机器学习库&#xff0c;与广泛应用的 Java 语言相结合&#xff0c;为数据科学家和开发者们提供了丰富的可能性。那么&#xff0c;Apache Spark MLlib 与 Java 结合的最佳实践究竟是什么呢&#…

嵌入式轻量级开源操作系统:HeliOS的使用

嵌入式轻量级开源操作系统:HeliOS的使用 &#x1f4cd;项目地址&#xff1a;https://github.com/heliosproj/HeliOS HeliOS项目是一个社区交付的开源项目&#xff0c;用于构建和维护HeliOS嵌入式操作系统&#xff08;OS&#xff09;。HeliOS是一个功能齐全的操作系统&#xff0…

黑马Java面试教程_P9_JVM虚拟机

系列博客目录 文章目录 系列博客目录前言1. JVM组成1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f;3 41.2 什么是程序计数器&#xff1f;3 4总结 1.3 你能给我详细的介绍Java堆吗? 3 4总结 1.4 什么是虚拟机栈 3 4总结 1.6 能不能解释一下方法区&#xff1f; 3…

YOLO11改进-注意力-引入多尺度卷积注意力模块MSCAM

如何在增强特征图的同时降低计算成本&#xff0c;以提升模型性能。基于此&#xff0c;MSCAM 模块采用了多尺度卷积注意力机制&#xff0c;通过 CAB、SAB 和 MSCB 三个子模块协同工作。CAB 利用自适应池化和卷积操作生成通道注意力权重&#xff0c;强调重要通道特征&#xff1b;…

Kafka无锁设计

前言 在分布式消息队列系统中,Kafka 的无锁设计是其高吞吐量和高并发的核心优势之一。通过避免锁的竞争,Kafka 能够在高并发和大规模的生产环境中保持高效的性能。为了更好地理解 Kafka 的无锁设计,我们首先对比传统的队列模型,然后探讨 Kafka 如何通过无锁机制优化生产者…

Refusal in Language Models Is Mediated by a Single Direction

开源代码&#xff1a;https://github.com/andyrdt/refusal_direction Abstract 会话型大语言模型针对指令遵循和安全性进行了微调&#xff0c;从而产生服从良性请求但拒绝有害请求的模型。虽然这种拒绝行为在聊天模型中普遍存在&#xff0c;但其背后的机制仍然知之甚少。在这…

智慧平台数据可视化解决方案(附实践资料下载)

阿里云详解数据可视化大屏构建&#xff0c;内容涉及数据可视化大屏的构建。以下是该文件的核心内容概要&#xff1a; 数据可视化大屏概述&#xff1a; 数据可视化大屏的定义和目的。大屏在企业决策中的作用。 大屏设计原则&#xff1a; 强调用户体验和视觉美感。信息的清晰度和…

基于openlayers 开发vue地图组件

先看效果 主要功能如下&#xff1a; 测量图源更换放大缩小地图添加点hover点数据切换到地图位置&#xff1b;也设定层级2D3D切换&#xff0c;3D为cesium开发&#xff0c;技术交流可以加V&#xff1a;bloxed 地图工具做了插槽&#xff0c;分为toolbar&#xff08;左上角工具…

大模型(LLM)提示工程(Prompt Engineering)初识

大模型提示工程&#xff08;Prompt Engineering&#xff09;是指设计和优化给定任务的输入提示&#xff0c;以便从大型语言模型&#xff08;如GPT-4、GPT-3等&#xff09;中获得最佳输出。其核心目标是通过合理设计输入内容&#xff08;提示词或提示结构&#xff09;&#xff0…

人工智能ACA(六)--计算机视觉基础

一、计算机视觉概述 1. 计算机视觉定义 人工智能&#xff08;AI&#xff09;的一个重要分支旨在使计算机和系统能够从图像或多维数据中“理解”和“解释”视觉世界通过模拟人类视觉系统&#xff0c;计算机视觉技术能够自动执行诸如识别、分类、检测和跟踪等任务。 2. 计算机…

叉车作业如何确认安全距离——UWB测距防撞系统的应用

叉车在工业环境中运行&#xff0c;常常需要在狭窄的空间内完成货物的搬运和堆垛&#xff0c;这对操作员的技术水平和安全意识提出了极高的要求。传统的叉车作业依赖操作员的经验和视觉判断来确认安全距离&#xff0c;然而这种方式往往存在误差&#xff0c;特别是在视线受阻或光…

基于深度学习(HyperLPR3框架)的中文车牌识别系统-搭建开发环境

本篇内容为搭建开发环境。包括&#xff1a;python开发环境&#xff0c;Qt/C开发环境&#xff0c;以及用到的各个库的安装和配置。 一、Python开发环境搭建与配置 1、下载并安装Anaconda 我没有用最新的版本&#xff0c;安装的是 Anaconda3-2021.05-Windows-x86_64.exe&#…

神经网络-AlexNet

AlexNet是在2012年的ImageNet竞赛后&#xff0c;整理发表的文章&#xff0c;也是对CNN网络的衍生。 网络结构 AlexNet网络结构如下图所示&#xff0c;网络分为了上下两部分&#xff0c;对应两个不同的GPU训练&#xff0c;可以更好的利用GPU算力。只有在特殊的网络层后&#x…