跳转至

二维数组语法

定义

二维数组是数组的数组,本质上是一个矩阵结构。

int a[100][100]; // 定义一个最多 100 行 100 列的二维整型数组

初始化

可以使用以下方式对二维数组进行初始化:

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

或者简写为:

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

未初始化的元素会自动填充为 $0$:

int a[3][3] = {{1}, {2}, {3}};
// 实际内容为:
// 1 0 0
// 2 0 0
// 3 0 0

访问元素

使用下标 a[i][j] 访问第 i 行第 j 列的元素(下标从 $0$ 开始):

cout << a[1][2]; // 输出第 1 行第 2 列的值

常见格式:读入 $n$ 行 $m$ 列

假设输入一个 $n$ 行 $m$ 列的矩阵:

#include <bits/stdc++.h>
using namespace std;
int a[105][105];
int main() 
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) 
    {
        for (int j = 1; j <= m; j++) 
        {
            cin >> a[i][j];
        }
    }
    return 0;
}

同样地,你可以定义三维、四维,以及更高维的数组。


基础例题

题目一:二维数组行的遍历。

题意:给定一个 $n$ 行 $m$ 列的二维数组 $a$,同时给定一个数字 $x$,请你输出第 $x$ 行的所有元素。以及求出第 $x$ 行所有元素的和。$1\leq n,m\leq 100,1\leq x\leq n,1\leq a_{i,j}\leq 10^9$

思路

第 $x$ 行的元素分别为:$a[x][1],a[x][2],\ldots,a[x][m]$。

可以看出只有列再变化,因此遍历列 $j$ 其中 $j\in [1,m]$。输出所有元素并累加求和即可,注意根据数据范围需要 long long

long long sum = 0;
for (int i = 1; i <= m; i++)
{
    cout << a[x][i] << " ";
    sum += a[x][i];
}
cout << "\n" << sum;

题目二:二维数组列的遍历

题意:给定一个 $n$ 行 $m$ 列的二维数组 $a$,同时给定一个数字 $y$,请你输出第 $y$ 列的所有元素。以及求出第 $y$ 列所有元素的和。$1\leq n,m\leq 100,1\leq y\leq m,1\leq a_{i,j}\leq 10^9$

思路

第 $y$ 列的元素分别为:$a[1][y],a[2][y],\ldots,a[n][y]$。

可以看出只有行再变化,因此遍历行 $i$ 其中 $i\in [1,n]$。输出所有元素并累加求和即可,注意根据数据范围需要 long long

long long sum = 0;
for (int i = 1; i <= n; i++)
{
    cout << a[i][y] << " ";
    sum += a[i][y];
}
cout << "\n" << sum;

题目三:计算矩阵边缘元素之和

题意:输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。$1 \le m,n \le 100$。保证答案在 int 范围内。

思路

答案可以通过遍历所有位置,然后使用 if 语句判断位置 $(i,j)$ 是否在边缘来实现。

如果一个位置 $(i,j)$ 在边缘上,则满足以下条件之一:

  • $i = 1$ 或 $i = n$(第一行或最后一行)
  • $j = 1$ 或 $j = m$(第一列或最后一列)
for (int i = 1; i <= n; i++)
{
    for (int j = 1; j <= m; j++)
    {
        if (i == 1 || i == n || j == 1 || j == m) // 判断是否在边缘
        {
            sum += a[i][j]; // 累加边缘元素
        }
    }
}

题目四:矩阵转置

题意:输入一个 $n$ 行 $m$ 列的矩阵 $A$,输出它的转置 $A^T$。转置就是将矩阵的行和列互换。$1 \leq n,m \leq 100$。

思路

转置矩阵 $A^T$ 的第 $i$ 行第 $j$ 列元素等于原矩阵 $A$ 的第 $j$ 行第 $i$ 列元素,即 $A^T[i][j] = A[j][i]$。

具体实现可以借助一个新的二维数组 b 来存储转置后的结果。

  • 首先输入原矩阵 $A$。
  • 然后遍历原矩阵,将每个元素放到转置矩阵的对应位置。
  • 最后输出转置矩阵。
#include <bits/stdc++.h>
using namespace std;
int a[105][105], b[105][105];
int main() 
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) 
    {
        for (int j = 1; j <= m; j++) 
        {
            cin >> a[i][j];
        }
    }
    for (int j = 1; j <= m; j++) 
    {
        for (int i = 1; i <= n; i++) 
        {
            b[j][i] = a[i][j];
        }
    }
    for (int i = 1; i <= m; i++) 
    {
        for (int j = 1; j <= n; j++) 
        {
            cout << b[i][j] << " ";
        }
        cout << "\n";
    }
    return 0;
}