二维数组

题单类型:官方题单
创建人:
ACGO官方
题数:20
收藏题单
完成度:0/20

二维数组

数组是一种用于存储多个相同类型数据的数据结构。当数据具有行和列的结构特征时,就需要使用 二维数组 来进行描述,例如表格、矩阵、棋盘、成绩单等。

二维数组可以理解为:由多个一维数组组成的数组

1. 二维数组的概念

一维数组可以表示一排数据,例如:

int a[5];

而二维数组可以表示多排多列的数据,例如:

int a[3][4];

表示一个 3 行 4 列 的整型数组。

从数学角度看,二维数组常用来表示一个矩阵:

(a0,0a0,1a0,2a0,3a1,0a1,1a1,2a1,3a2,0a2,1a2,2a2,3)\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}

其中 ai,ja_{i,j} 表示 ii 行、第 jj 的元素。

与一维数组相同,二维数组同样从下标 00 开始,最大下标分别为 行数-1列数-1

但一般我们在使用数组时为了与题目描述和生活习惯相一致,习惯存储从下标从 11 开始,最大下标分别为 行数列数。所以定义二维数组时数组大小也要比最大的可能再大一些。

2. 二维数组的定义方式

二维数组的基本定义格式为:

数据类型 数组名[行数][列数];

例如:

int score[5][3];

表示 5 个学生、每人 3 门课成绩 的数组。

需要注意的是:

  • 行数和列数都必须是常量
  • 下标从 00 开始
  • 最大下标分别为 行数-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}
};

未赋值的元素会自动补 00,结果为:

[120400]\begin{bmatrix} 1 & 2 & 0 \\ 4 & 0 & 0 \end{bmatrix}

省略行数初始化:

在初始化时,可以省略行数,但不能省略列数

int a[][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

系统会根据初始化数据自动推断行数。

4. 二维数组的访问

二维数组通过 两个下标 访问元素:

数组名[行下标][列下标]

例如:

a[1][2] = 10;

表示将第 22 行、第 33 列的元素赋值为 1010

如果数组定义为 int a[3][4];,那么合法下标范围为:

  • 行下标:020 \sim 2
  • 列下标:030 \sim 3

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)(i,j) 组合进行枚举,对每行中的每一列位置进行访问。

6. 二维数组的常见应用

以成绩统计为例,将编号为 ii 的学生成绩存到行号为 ii 的行中:

int score[3][4]; // 3个学生,4门课程
  • 行:学生编号
  • 列:课程编号

计算编号为 xx 的学生的总成绩:

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 矩阵运算

二维数组常用于矩阵问题,如矩阵加法:

Ci,j=Ai,j+Bi,jC_{i,j} = A_{i,j} + B_{i,j}

代码实现:

c[i][j] = a[i][j] + b[i][j];

二维数组还可以用于表格与地图问题:

  • 棋盘
  • 地图
  • 网格路径
  • 雷区标记

二维数组可以直观表示 空间位置关系,但需要注意我们一般表示的矩阵表格与数学中的常规坐标系(笛卡尔坐标系)有所不同,要注意方向和变量表示的意义。

我们在分析样例时要注意行号与列号的变化方向,如果与样例的方向不同可能会导致无法理解样例。

7. 常见错误与注意事项

  1. 数组越界
a[3][0]; // 若行数为3,则下标3非法
  1. 行列顺序写反
a[列][行]; // 逻辑错误但不一定报错
  1. 列数不能省略
int a[][]; // 错误写法

总结

二维数组是对一维数组的扩展,用于描述具有 行列结构 的数据。其核心要点包括:

  • 明确内外层循环变量的行与列的含义
  • 正确理解下标从 00 开始
  • 使用嵌套循环进行遍历
  • 常用于矩阵、表格、地图等问题

在实际编程中,应先在逻辑上画出或想象数据的二维结构,再将其对应到数组下标,有助于减少错误,提高代码可读性。


本次题单设计了二维数组知识点,其中细化到二维数组的定义、使用、遍历以及特殊遍历等拓展内容。

通过学习本题单,你可以掌握二维数组的基本操作和遍历方法,学会处理行列顺序、边缘判断、方位表示以及嵌套统计等问题,从而提升对二维数据结构的理解与应用能力

【前置知识点】
1、数组
2、循环嵌套

【后置衔接知识点】
1、前缀和

【思维导图】

【题目知识点分类】