测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看
官方题单 学习路径 知识点专项

二维数组

按行列理解矩阵存取,练矩阵遍历、标记与简单模拟。

题数:20题
完成度:0/20

二维数组



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

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

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];,那么合法下标范围为:
  • 行下标:$0 \sim 2$
  • 列下标:$0 \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)$ 组合进行枚举,对每行中的每一列位置进行访问。

    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[][]; // 错误写法


    总结



    二维数组是对一维数组的扩展,用于描述具有 行列结构 的数据。其核心要点包括:
  • 明确内外层循环变量的行与列的含义
  • 正确理解下标从 $0$ 开始
  • 使用嵌套循环进行遍历
  • 常用于矩阵、表格、地图等问题
在实际编程中,应先在逻辑上画出或想象数据的二维结构,再将其对应到数组下标,有助于减少错误,提高代码可读性。




---

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

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

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

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

【思维导图】



【题目知识点分类】