2026年3月GESP真题及题解(C++四级):山之谷

题目描述
现有一片山地,可以视为一个
行
列的网格图,第
行
列的海拔为
。
如果一个单元格的海拔不高于其所有相邻单元格(相邻包括上、下、左、右、左上、右上、左下、右下,最多
个方向)的海拔,则称该单元格为山谷。
请你数一数该片山地中有多少山谷。
输入格式
第一行包含
个整数
,表示山地的大小。
之后
行,每行包含
个整数
,表示海拔。
输出格式
输出
行,包含
个整数
,表示山谷的数量。
输入输出样例 #1
输入 #1
3 57 6 6 7 96 5 6 7 66 5 7 8 9
输出 #1
3说明/提示
样例解释
样例 1 如图所示,绿色单元格代表山谷:

数据范围
保证
,
。
思路分析
算法思路
读入网格行数 n、列数m及海拔数据h。定义方向数组 dx和dy,分别表示八个方向的行列偏移量。对于每一个单元格 (i, j),调用check(i, j)函数:遍历八个方向,计算相邻单元格坐标 (nx, ny)。如果相邻坐标在网格范围内,且当前单元格海拔 h[i][j]大于该相邻单元格海拔,则说明当前单元格不是山谷,返回false。如果所有合法邻居都不满足 h[i][j] > h[nx][ny],则当前单元格是山谷,返回true。统计所有返回 true的单元格数量,输出结果。
关键点
只考虑实际存在的邻居(通过边界判断 nx>=1 && nx<=n && ny>=1 && ny<=m)
代码实现
#include<bits/stdc++.h>using namespace std;int n, m; // 网格行数、列数int h[110][110]; // 海拔数组,下标从1开始int cnt = 0; // 山谷计数器// 八个方向的行列偏移量 (顺序: 左上、上、右上、右、右下、下、左下、左)int dx[8] = {-1, -1, -1, 0, 1, 1, 1, 0};int dy[8] = {-1, 0, 1, 1, 1, 0, -1, -1};// 检查单元格 (x, y) 是否为山谷boolcheck(int x, int y){for (int i = 0; i < 8; i++) { // 遍历八个方向int nx = x + dx[i]; // 邻居行坐标int ny = y + dy[i]; // 邻居列坐标// 判断邻居是否在网格内if (nx >= 1 && nx <= n && ny >= 1 && ny <= m) {// 如果当前海拔 > 邻居海拔,则不满足山谷条件if (h[x][y] > h[nx][ny]) return false;}}// 所有合法邻居都不高于当前单元格,则当前是山谷return true;}intmain(){// 读入网格大小cin >> n >> m;// 读入海拔数据for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> h[i][j];}}// 遍历每个单元格,统计山谷个数for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (check(i, j)) cnt++;}}// 输出结果cout << cnt;return 0;}
功能分析
- 正确性
严格按照题目定义:每个单元格需检查所有八个方向(边界处忽略不存在的邻居),只要存在一个海拔更低的邻居,即判定为非山谷。 对于等高的情况,代码判定为山谷,符合“不高于”的要求。 边界处理:通过 if (nx>=1 && nx<=n && ny>=1 && ny<=m)过滤无效邻居,不会越界。- 时间复杂度
双重循环遍历所有单元格:O(N×M)。 每个单元格检查最多8个邻居:常数时间。 总复杂度 O(8×N×M) ≈ 8×10⁴(N,M ≤ 100)。 - 空间复杂度
海拔数组 h[110][110]占用固定大小,约 110×110×4 字节 ≈ 48 KB。
各种学习资料,助力大家一站式学习和提升!!!
#include<bits/stdc++.h>using namespace std;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return 0;}
【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901

2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437
3、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:https://blog.csdn.net/weixin_66461496/category_13096895.html
CSP信奥赛C++标准模板库STL:https://blog.csdn.net/weixin_66461496/category_13108077.html
信奥赛C++提高组csp-s知识详解及案例实践:https://blog.csdn.net/weixin_66461496/category_13113932.html
4、csp信奥赛冲刺一等奖有效刷题题解:
CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_13125089.html
5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html
GESP(C++ 七级+八级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_13117178.html
· 文末祝福 ·
#include<bits/stdc++.h>using namespace std;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return 0;}
