蓝桥题库每日一练 · 2026.10.03

10月3日 请编程求出二维数组中某个元素的「相邻数之和」。相…

C++编程题参考难度 ★★★☆☆蓝桥杯第十一届 选拔赛 · 已用
请编程求出二维数组中某个元素的「相邻数之和」。相邻数是指与这个元素挨着的 8 个元素(上、下、左、右和四个斜角);如果这个元素在边上或角上,相邻的元素就相应减少。下图是一个 4 行 5 列的二维数组 a(行号、列号都从 0 开始):a[2][3] 的值为 7,它的相邻元素是 8、9、10、5、8、6、8、0,和为 54;再比如 a[1][0] 的值为 6,它的相邻元素是 1、2、7、3、4,和为 17。输入:第一行输入 4 个整数 h、l、c、r,分别代表二维数组的行数、列数,以及指定元素的行下标和列下标;接下来输入 h 行、每行 l 个整数,即 int 型二维数组 a,每个数都在 −1000000000~1000000000 之间。其中 2≤h、l≤10,0≤c、r≤9(下标从 0 开始,指定的元素一定在数组里)。输出:a[c][r] 的相邻元素之和。
行\列012340123123456789103457825680黄格 a[2][3]=7,绿格是它的 8 个相邻数
样例
输入 4 5 2 3 1 2 3 4 5 6 7 8 9 10 3 4 5 7 8 2 5 6 8 0输出 54
输入 4 5 1 0 1 2 3 4 5 6 7 8 9 10 3 4 5 7 8 2 5 6 8 0输出 17
评分标准
  • 30 分:完成给出的第一个测试用例
  • 50 分:再完成一个测试用例
  • 100 分:完成全部测试用例
参考解法
先认识一下「二维数组」:它就像一张表格,或者电影院里一排排的座位。a[2][3] 的意思是「第 2 行、第 3 列」那个格子——注意编程里行号、列号都从 0 开始数,所以它其实是第三行、第四个。题目里用 c 表示行号、r 表示列号,别弄混了。

要求的是一个格子「周围一圈」的数加起来。周围一圈怎么找?你看,相邻的格子,行号只可能是「上一行、同一行、下一行」(行号 −1、0、+1),列号也只可能是「左一列、同一列、右一列」(列号 −1、0、+1)。三种行 × 三种列 = 9 个位置,扣掉正中间的自己(行、列都不动的那个),正好 8 个邻居。

所以用两层小循环:dx 从 −1 走到 1、dy 从 −1 走到 1,算出邻居的位置 x = c + dx、y = r + dy,跳过 dx、dy 都是 0 的自己,把其余的加起来。

但要当心边界!如果格子在最边上,比如 a[1][0] 在最左边一列,它左边那一列(列号 −1)根本不存在。程序要是硬去读 a[1][-1],就「越界」了——读到的是数组外面不知道什么东西,答案就乱了。所以每个邻居加之前先查一句:x 在 0~h−1 之间、y 在 0~l−1 之间,都满足才算数。

还有一个藏得更深的坑:sum 这个「盒子」够不够大?C++ 里 int 最多只能装到 2147483647(大约 21 亿)。题目说每个数最大可以到 10 亿,8 个 10 亿加起来是 80 亿,int 装不下,就会「溢出」——算出来可能是个负数。所以 sum 要用 long long,它是个大得多的盒子,80 亿稳稳装得下。(数组里每个数本身不超过 10 亿,用 int 存就够了。)

#include <bits/stdc++.h>
using namespace std;
int a[10][10];……

看此题详解,练更多题目,进入蓝桥题库每日一练 →

此答案或解析由 AI 生成,请谨慎使用。
难度依赛考组别及等考级别粗略评估,仅供参考。