二维数组
数组是一种用于存储多个相同类型数据的数据结构。当数据具有行和列的结构特征时,就需要使用 二维数组 来进行描述,例如表格、矩阵、棋盘、成绩单等。
二维数组可以理解为:由多个一维数组组成的数组。
1. 二维数组的概念
一维数组可以表示一排数据,例如:
int a[5];而二维数组可以表示多排多列的数据,例如:
int a[3][4];表示一个 3 行 4 列 的整型数组。
从数学角度看,二维数组常用来表示一个矩阵:
$$ \begin{pmatrix} a_{0,0} & a_{0,1} & a_{0,2} & a_{0,3} \\ a_{1,0} & a_{1,1} & a_{1,2} & a_{1,3} \\ a_{2,0} & a_{2,1} & a_{2,2} & a_{2,3} \end{pmatrix} $$
其中 $a_{i,j}$ 表示 第 $i$ 行、第 $j$ 列 的元素。
与一维数组相同,二维数组同样从下标 $0$ 开始,最大下标分别为
行数-1 和 列数-1。但一般我们在使用数组时为了与题目描述和生活习惯相一致,习惯存储从下标从 $1$ 开始,最大下标分别为
行数 和 列数。所以定义二维数组时数组大小也要比最大的可能再大一些。2. 二维数组的定义方式
二维数组的基本定义格式为:
数据类型 数组名[行数][列数];例如:
int score[5][3];表示 5 个学生、每人 3 门课成绩 的数组。
需要注意的是:
- 行数和列数都必须是常量
- 下标从 $0$ 开始
- 最大下标分别为
行数-1和列数-1
3. 二维数组的初始化
完全初始化
int a[2][3] = {
{1, 2, 3},
{4, 5, 6}
};等价于:
int a[2][3] = {1, 2, 3, 4, 5, 6};数组在内存中是按行顺序连续存储的。
部分初始化:
int a[2][3] = {
{1, 2},
{4}
};未赋值的元素会自动补 $0$,结果为:
$$ \begin{bmatrix} 1 & 2 & 0 \\ 4 & 0 & 0 \end{bmatrix} $$
省略行数初始化:
在初始化时,可以省略行数,但不能省略列数:
int a[][3] = {
{1, 2, 3},
{4, 5, 6}
};系统会根据初始化数据自动推断行数。
4. 二维数组的访问
二维数组通过 两个下标 访问元素:
数组名[行下标][列下标]例如:
a[1][2] = 10;表示将第 $2$ 行、第 $3$ 列的元素赋值为 $10$。
如果数组定义为
int a[3][4];,那么合法下标范围为:5. 二维数组的遍历
二维数组通常使用 嵌套(双重)循环 进行遍历:
for(int i = 0; i < 行数; i++){
for(int j = 0; j < 列数; j++){
cout << a[i][j] << " ";
}
cout << endl;
}外层循环控制 行,内层循环控制 列。
二维数组中元素的总个数为:
$$ \text{元素总数} = \text{行数} \times \text{列数} $$
双重循环本质上是对所有 $(i,j)$ 组合进行枚举,对每行中的每一列位置进行访问。
6. 二维数组的常见应用
以成绩统计为例,将编号为 $i$ 的学生成绩存到行号为 $i$ 的行中:
int score[3][4]; // 3个学生,4门课程计算编号为 $x$ 的学生的总成绩:
for(int i = x; i <= x; i++){
int sum = 0;
for(int j = 0; j < 4; j++){
sum = sum + score[i][j];
}
cout << ans << endl;
}6.2 矩阵运算
二维数组常用于矩阵问题,如矩阵加法:
$$ C_{i,j} = A_{i,j} + B_{i,j} $$
代码实现:
c[i][j] = a[i][j] + b[i][j];二维数组还可以用于表格与地图问题:
二维数组可以直观表示 空间位置关系,但需要注意我们一般表示的矩阵表格与数学中的常规坐标系(笛卡尔坐标系)有所不同,要注意方向和变量表示的意义。
我们在分析样例时要注意行号与列号的变化方向,如果与样例的方向不同可能会导致无法理解样例。
7. 常见错误与注意事项
1. 数组越界
a[3][0]; // 若行数为3,则下标3非法2. 行列顺序写反
a[列][行]; // 逻辑错误但不一定报错3. 列数不能省略
int a[][]; // 错误写法总结
二维数组是对一维数组的扩展,用于描述具有 行列结构 的数据。其核心要点包括:
---
本次题单设计了二维数组知识点,其中细化到二维数组的定义、使用、遍历以及特殊遍历等拓展内容。
通过学习本题单,你可以掌握二维数组的基本操作和遍历方法,学会处理行列顺序、边缘判断、方位表示以及嵌套统计等问题,从而提升对二维数据结构的理解与应用能力。
【前置知识点】
1、数组
2、循环嵌套
【后置衔接知识点】
1、前缀和
【思维导图】

【题目知识点分类】
01
二维数组查询I
入门
--
练习
02
二维数组查询II
入门
--
练习
03
二维数组查询III
入门
--
练习
04
二维数组查询IV
入门
--
练习
05
二维数组查询V
入门
--
练习
06
二维数组查询VI
入门
--
练习
07
二维数组查询VII
入门
--
练习
08
二维数组查询VIII
入门
--
练习
09
二维数组查询IX
入门
--
练习
10
二维数组查询X
入门
--
练习
11
二维数组查询XI
入门
--
练习
12
二维数组查询XII
入门
--
练习
13
矩阵加法
入门
--
练习
14
蛇皮矩阵
入门
--
练习
15
二维数组查询XIII
入门
--
练习
16
二维数组查询XIV
入门
--
练习
17
计算矩阵边缘元素之和
入门
--
练习
18
扫雷游戏
入门
--
练习
19
轰炸III
入门
--
练习
20
小码君找鞍点
入门
--
练习