当前位置: 首页 > news >正文

信息学奥赛一本通 1454:山峰和山谷

【题目链接】

ybt 1454:山峰和山谷

【题目考点】

1. 网格图:连通块 深搜 广搜

【解题思路】

相同高度的相邻多个位置构成一个连通块。
设二维数组标记每个位置是否已访问过。
尝试从每个位置出发进行搜索(可以进行深搜或广搜)。
如果该位置没有访问过,则从该位置开始进行搜索。
访问某位置(sx,sy)后,尝试访问其周围(上、下、左、右、左上、右上、左下、右下)的位置(x,y),(x,y)位置需要保证在地图范围内且没有访问过。

  • 如果(x,y)位置的高度与(sx,sy)位置的高度相同,那么从(x,y)位置出发继续进行搜索。
  • 如果(x,y)位置的高度与(sx,sy)位置的高度不同,(x,y)位置就是(sx,sy)位置所属的连通块周围的一个位置。
    • 如果(x,y)位置比(sx,sy)位置更高,则记录周围存在比当前连通块更高的的位置。
    • 如果(x,y)位置比(sx,sy)位置更矮,则记录周围存在比当前连通块更矮的的位置。

当前连通块搜索结束后,

  • 如果周围只存在比当前连通块更高的位置,则当前连通块是山谷,山谷数量加1。
  • 如果周围只存在比当前连通块更矮的位置,则当前连通块是山峰,山峰数量加1。

最后输出山谷和山峰的数量。

【题解代码】

解法1:广搜 连通块

#include<bits/stdc++.h>
using namespace std;
#define N 1005
struct Pair
{int x, y;
};
int n, peak, valley, a[N][N], dir[8][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
bool vis[N][N], hasHigher, hasLower;
void bfs(int stx, int sty)
{hasHigher = hasLower = false;queue<Pair> que; que.push(Pair{stx, sty});vis[stx][sty] = true;while(!que.empty()){int sx = que.front().x, sy = que.front().y;que.pop();for(int i = 0; i < 8; ++i){int x = sx+dir[i][0], y = sy+dir[i][1];if(x >= 1 && x <= n && y >= 1 && y <= n){if(a[sx][sy] == a[x][y] && !vis[x][y]){vis[x][y] = true;que.push(Pair{x, y});}else if(a[sx][sy] < a[x][y])hasHigher = true;else if(a[sx][sy] > a[x][y])hasLower = true;}}}if(hasHigher && !hasLower)//只有比自己高的,没有比自己低的 valley++;else if(!hasHigher && hasLower)//只有比自己低的,没有比自己高的 peak++;else if(!hasHigher && !hasLower)//周围没有格子,自己是唯一的,是山峰也是山谷valley++, peak++; 
}
int main()
{cin >> n;for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j)cin >> a[i][j];for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j) if(!vis[i][j])bfs(i, j);cout << peak << ' ' << valley;return 0;
}

解法2:深搜 连通块

#include<bits/stdc++.h>
using namespace std;
#define N 1005
int n, peak, valley, a[N][N], dir[8][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
bool vis[N][N], hasHigher, hasLower;
void dfs(int sx, int sy)
{vis[sx][sy] = true;for(int i = 0; i < 8; ++i){int x = sx+dir[i][0], y = sy+dir[i][1];if(x >= 1 && x <= n && y >= 1 && y <= n){if(a[sx][sy] == a[x][y] && !vis[x][y])dfs(x, y);else if(a[sx][sy] < a[x][y])hasHigher = true;else if(a[sx][sy] > a[x][y])hasLower = true;}}
}
int main()
{cin >> n;for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j)cin >> a[i][j];for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j) if(!vis[i][j]){hasHigher = hasLower = false;dfs(i, j);if(hasHigher && !hasLower)//只有比自己高的,没有比自己低的 valley++;else if(!hasHigher && hasLower)//只有比自己低的,没有比自己高的 peak++;else if(!hasHigher && !hasLower)//周围没有格子,自己是唯一的,是山峰也是山谷valley++, peak++; }cout << peak << ' ' << valley;return 0;
}
http://www.xdnf.cn/news/217423.html

相关文章:

  • < 自用文 rclone > 在 Ubuntu 24 访问 Google Drive 网络内容
  • 双剑合璧:融合视觉基础与语言模型,勇闯未知领域的语义分割新框架
  • Linux开发中的线程管理(C++11 std::thread)
  • Pytorch 反向传播
  • 塔能照明节能服务流程:精准驱动工厂能耗优化
  • leetcode:3005. 最大频率元素计数(python3解法)
  • 第三次作业(密码学)
  • 【android bluetooth 协议分析 06】【l2cap详解 11】【l2cap连接超时处理逻辑介绍】
  • (29)VTK C++开发示例 ---绘制两条彩色线
  • 想做博闻强记的自己
  • IoTDB数据库建模与资源优化指南
  • Python中的defaultdict方法
  • 驱动开发硬核特训 · Day 24(下篇):深入理解 Linux 内核时钟子系统结构
  • 【深度学习的灵魂】图片布局生成模型LayoutPrompt(1)
  • MATLAB函数调用全解析:从入门到精通
  • 【Linux】g++安装教程
  • Linux 命名管道+日志
  • 婴幼儿托育实训室生活照料流程标准化设计
  • Flowable7.x学习笔记(十五)动态指定用户分配参数启动工作流程
  • AutogenStudio使用
  • 快速掌握向量数据库-Milvus探索2_集成Embedding模型
  • AI技术前沿:Function Calling、RAG与MCP的深度解析与应用实践
  • 基于PyTorch的图像分类特征提取与模型训练文档
  • 集群系统的五大核心挑战与困境解析
  • EtherCAT转CANopen方案落地:推动运动控制器与传感器通讯的工程化实践
  • CKESC Breeze 6S 40A_4S 50A FOC BEC电调测评:全新vfast 技术赋能高效精准控制
  • 低代码平台部署方案解析:百特搭四大部署方式
  • 大模型推理:Qwen3 32B vLLM Docker本地部署
  • 强化学习贝尔曼方程推导
  • 流量守门员:接口限流艺术