C++ 竞赛入门

数组

数组补充:二维数组

本节学会什么

  • 用二维数组表示表格和棋盘
  • 通过两个下标访问“第几行第几列”
  • 用嵌套循环遍历二维数组

为什么需要它

一维数组适合一排数据,座位表、地图和矩阵却有行和列两个方向。二维数组就是“每个元素仍然是数字,但位置同时由行号和列号确定”的表格。

最小可运行示例

读入一个 nm 列的表格,输出所有元素的和:

#include <iostream>

int main() {
    const int max_n = 100;
    const int max_m = 100;
    int n, m;
    int grid[max_n][max_m];
    std::cin >> n >> m;

    int sum = 0;
    for (int row = 0; row < n; row += 1) {
        for (int col = 0; col < m; col += 1) {
            std::cin >> grid[row][col];
            sum += grid[row][col];
        }
    }

    std::cout << sum << '\n';
    return 0;
}

grid[row][col] 先定位第 row 行,再定位这一行的第 col 列。若有 n 行、m 列,行下标范围是 0n - 1,列下标范围是 0m - 1

二维数组图:行号定位一行,列号定位该行中的一个 grid 元素

关键过程与易错点

  • 定义 int grid[3][4]; 时,第一维是行数,第二维是列数;它共有 3 * 4 个元素。
  • 处理整张表通常需要两层循环。外层控制行,内层控制列,读入和输出的顺序都要和题目一致。
  • 二维数组的两个下标都要检查边界。grid[n][0]grid[0][m] 都不合法。
  • 只需记住“行、列”的含义,不要把 ij 当作魔法字母。复杂题中使用 rowcol 更不容易写反。

动手检查

读入一个 33 列的整数表格,输出主对角线 grid[0][0]grid[1][1]grid[2][2] 的和。

再输出每一行的和:每进入一行时把 row_sum 重置为 0,在内层循环中累加,内层结束后输出。

立即练习

难度 题目 题解 训练目标
基础 洛谷 P5730:显示屏 题解 将字符输出组织成固定的行和列。
巩固 洛谷 P5729:工艺品制作 题解 练习多维下标、嵌套循环与边界。