GESP认证C++编程真题解析 | 202603 四级

发布时间:2026/5/26 2:29:06

GESP认证C++编程真题解析 | 202603 四级 编程题B4501 山之谷【题目来源】洛谷[B4501 GESP202603 四级] 山之谷 - 洛谷【题目描述】现有一片山地可以视为一个N NN行M MM列的网格图第i ii行j jj列的海拔为h i , j h_{i,j}hi,j​。如果一个单元格的海拔不高于其所有相邻单元格相邻包括上、下、左、右、左上、右上、左下、右下最多8 88个方向的海拔则称该单元格为山谷。请你数一数该片山地中有多少山谷。【输入】第一行包含2 22个整数N , M N, MN,M表示山地的大小。之后N NN行每行包含M MM个整数h i , 1 , h i , 2 , ⋯ , h i , M h_{i,1}, h_{i,2}, \cdots, h_{i,M}hi,1​,hi,2​,⋯,hi,M​表示海拔。【输出】输出1 11行包含1 11个整数C CC表示山谷的数量。【输入样例】3 5 7 6 6 7 9 6 5 6 7 6 6 5 7 8 9【输出样例】3【算法标签】《洛谷 B4501 山之谷》 #枚举# #GESP# #2026#【代码详解】#includebits/stdc.h// 包含所有标准库头文件usingnamespacestd;// 使用标准命名空间constintN105;// 定义常量N表示数组最大尺寸intn,m,cnt;// n:行数, m:列数, cnt:山谷计数器inta[N][N];// 定义二维数组a存储地形高度// 定义8个方向向量用于访问当前位置周围的8个邻居intdx[8]{-1,-1,-1,0,1,1,1,0};// x方向偏移左、左上、上、右上、右、右下、下、左下intdy[8]{-1,0,1,1,1,0,-1,-1};// y方向偏移上、上、上、右、右、右、下、下intmain()// 主函数入口{cinnm;// 输入矩阵的行数n和列数m// 读取矩阵数据for(inti1;in;i){for(intj1;jm;j){cina[i][j];// 读取第i行第j列的高度}}// 遍历矩阵中的每一个位置for(inti1;in;i){for(intj1;jm;j){boolflag1;// 标志位表示当前位置是否是山谷初始化为true// 检查当前位置的8个邻居for(intk0;k8;k){// 计算邻居位置的坐标intnxidx[k];// 邻居的x坐标intnyjdy[k];// 邻居的y坐标// 检查邻居是否在矩阵范围内if(nx1||nxn||ny1||nym){continue;// 如果邻居越界跳过这个邻居}// 检查山谷条件如果邻居高度小于当前位置高度则不是山谷if(a[nx][ny]a[i][j]){flag0;// 标记当前位置不是山谷break;// 提前退出循环不再检查其他邻居}}// 如果flag仍为1说明所有邻居都不小于当前位置当前位置是山谷if(flag){cnt;// 山谷计数器加1}}}coutcntendl;// 输出山谷的总数量return0;// 程序正常结束}【运行结果】3 5 7 6 6 7 9 6 5 6 7 6 6 5 7 8 9 3B4502 礼盒排序【题目来源】洛谷[B4502 GESP202603 四级] 礼盒排序 - 洛谷【题目描述】商店推出了许多礼盒每个礼盒中包含k kk件商品每件商品都有一个价格。现在需要对这些礼盒进行排序排序规则如下先按礼盒总价格从小到大排序如果总价格相同按礼盒中最贵商品的价格从小到大排序如果仍然相同按礼盒中最便宜商品的价格从小到大排序如果仍然相同按礼盒编号从小到大排序。请输出排序后的礼盒编号。【输入】第一行包含两个整数n nn和k kk分别表示礼盒数量和每个礼盒中商品的数量。接下来n nn行每行包含k kk个整数第i ii行表示第i ii个礼盒中各商品的价格。【输出】输出一行包含排序后的礼盒编号编号从1 11开始用空格分隔。【输入样例】4 3 3 5 2 4 1 5 2 2 4 3 4 3【输出样例】3 4 2 1【算法标签】《洛谷 B4502 礼盒排序》 #排序# #GESP# #2026#【代码详解】#includebits/stdc.h// 包含所有标准库头文件usingnamespacestd;// 使用标准命名空间constintN1005;// 定义常量N表示最大学生数量intn,k;// n: 学生数量, k: 每个学生的成绩数量// 定义学生结构体structNode{intid;// 学生编号intmaxn;// 该学生的最高成绩intminn;// 该学生的最低成绩inttot;// 该学生的总成绩}a[N];// 声明结构体数组a用于存储所有学生的信息// 自定义比较函数用于排序boolcmp(Node x,Node y){// 第一优先级按总成绩从小到大排序if(x.tot!y.tot){returnx.toty.tot;}// 第二优先级总成绩相同按最高成绩从小到大排序elseif(x.maxn!y.maxn){returnx.maxny.maxn;}// 第三优先级总成绩和最高成绩都相同按最低成绩从小到大排序elseif(x.minn!y.minn){returnx.minny.minn;}// 第四优先级所有成绩都相同按学号从小到大排序returnx.idy.id;}intmain()// 主函数入口{cinnk;// 输入学生数量n和每个学生的成绩数量k// 读取每个学生的k个成绩for(inti1;in;i){intx;// 临时变量用于读取每个成绩cinx;// 读取第一个成绩intmx,mn,sum0;// mx: 最高成绩, mn: 最低成绩, sum: 总成绩mxmnx;// 初始化最高成绩和最低成绩为第一个成绩sumx;// 将第一个成绩加入总成绩// 读取剩余的k-1个成绩for(intj2;jk;j){cinx;// 读取下一个成绩sumx;// 将成绩加入总成绩// 更新最高成绩if(xmx){mxx;}// 更新最低成绩if(xmn){mnx;}}// 将计算得到的值存入结构体数组a[i].idi;// 学号从1开始的序号a[i].maxnmx;// 最高成绩a[i].minnmn;// 最低成绩a[i].totsum;// 总成绩}// 使用自定义比较函数对数组进行排序// 注意数组下标从1开始所以排序范围是a1到an1sort(a1,an1,cmp);// 输出排序后的学号for(inti1;in;i){couta[i].id ;}coutendl;// 输出换行return0;// 程序正常结束}【运行结果】4 3 3 5 2 4 1 5 2 2 4 3 4 3 3 4 2 1

相关新闻