二维数组

概念讲解

什么是二维数组?

二维数组是一个矩阵,有行和列。

声明与初始化

123456789101112// 声明
int a[100][100];

// 初始化
int b[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

// 全部初始化为 0
int c[3][4] = {0};

访问元素

123int a[3][4];
a[0][0] = 1;  // 第 0 行第 0 列
a[1][2] = 5;  // 第 1 行第 2 列

遍历方式

按行遍历

123456for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        cout << a[i][j] << " ";
    }
    cout << endl;
}

按列遍历

123456for (int j = 0; j < m; j++) {
    for (int i = 0; i < n; i++) {
        cout << a[i][j] << " ";
    }
    cout << endl;
}

常见操作

矩阵转置

12345for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < m; j++) {
        swap(a[i][j], a[j][i]);
    }
}

矩阵加法

12345for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        c[i][j] = a[i][j] + b[i][j];
    }
}

矩阵乘法

12345678for (int i = 0; i < n; i++) {
    for (int j = 0; j < p; j++) {
        c[i][j] = 0;
        for (int k = 0; k < m; k++) {
            c[i][j] += a[i][k] * b[k][j];
        }
    }
}

考点分析

初赛考查方式

  1. 选择题: 二维数组操作
  2. 程序阅读: 矩阵处理
  3. 填空题: 数组下标

常见题型

  • 矩阵转置
  • 矩阵乘法
  • 蛇形填数

例题精讲

例题 1:矩阵转置

题目: 将矩阵转置。

解答:

12345for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < m; j++) {
        swap(a[i][j], a[j][i]);
    }
}

例题 2:蛇形填数

题目: 将 1~n² 填入 n×n 的矩阵,按蛇形顺序。

解答:

123456789101112int num = 1;
int top = 0, bottom = n - 1, left = 0, right = n - 1;
while (top <= bottom && left <= right) {
    for (int i = left; i <= right; i++) a[top][i] = num++;
    top++;
    for (int i = top; i <= bottom; i++) a[i][right] = num++;
    right--;
    for (int i = right; i >= left; i--) a[bottom][i] = num++;
    bottom--;
    for (int i = bottom; i >= top; i--) a[i][left] = num++;
    left++;
}

练习题

  1. 求矩阵的主对角线元素之和。
查看答案
12345int sum = 0;
for (int i = 0; i < n; i++) {
    sum += a[i][i];  // 主对角线:行号 = 列号
}
cout << sum << endl;
  1. 求矩阵的副对角线元素之和。
查看答案
12345int sum = 0;
for (int i = 0; i < n; i++) {
    sum += a[i][n - 1 - i];  // 副对角线:行号 + 列号 = n-1
}
cout << sum << endl;
  1. 将矩阵顺时针旋转 90 度。
查看答案
1234567891011// 先转置,再左右翻转
for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
        swap(a[i][j], a[j][i]);
    }
}
for (int i = 0; i < n; i++) {
    for (int j = 0; j < n / 2; j++) {
        swap(a[i][j], a[i][n - 1 - j]);
    }
}

易错点

⚠️ 注意:

  1. 二维数组下标从 0 开始
  2. 注意数组大小限制
  3. 矩阵乘法要注意维度匹配
  4. 蛇形填数要注意边界条件