1. 山谷探险:GESP C++四级编程题深度解析
最近在准备GESP C++四级考试的同学,一定对"山之谷"这道编程题印象深刻。这道题看似简单,实则暗藏玄机,考察了二维数组处理、边界条件判断和枚举算法等多个核心编程能力。作为一位经历过多次算法竞赛的老手,我想分享一下这道题的解题思路和实战技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题理解与定义
2.1 题目背景
题目描述了一个由数字组成的二维矩阵,每个数字代表该位置的高度。我们需要找出所有满足"山谷"条件的格子。所谓"山谷",是指一个格子,它的高度不大于其周围8个相邻格子的高度。
2.2 山谷的数学定义
严格来说,对于矩阵中的某个位置(i,j),如果满足:
h[i][j] ≤ h[x][y],其中(x,y)是(i,j)的所有8个相邻位置
那么这个位置就是一个山谷。注意这里的"≤"意味着允许相等的情况,也就是说,如果周围有相同高度的格子,仍然可以算作山谷。
3. 解题思路分析
3.1 暴力枚举法
最直接的思路是遍历矩阵中的每一个格子,然后检查它周围的8个邻居是否都大于等于它。这种方法虽然简单,但需要注意边界条件的处理。
cpp复制for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
bool isValley = true;
// 检查8个方向
for(int di=-1; di<=1; di++) {
for(int dj=-1; dj<=1; dj++) {
if(di==0 && dj==0) continue; // 跳过自己
int ni = i + di, nj = j + dj;
// 检查边界
if(ni>=0 && ni<n && nj>=0 && nj<m) {
if(matrix[i][j] > matrix[ni][nj]) {
isValley = false;
bre
