进阶 · 二维数组

矩阵求和

读入一个 rows x cols 的矩阵,输出所有元素之和。第一道输入形状真正影响程序的嵌套循环题。

一句话答案先读行数和列数,再用两层循环把每个元素加起来 —— 内层循环每行要读 cols 个数,不是 rows 个。

题目

输入: 第一行:行数和列数。之后 rows 行,每行 cols 个整数。

输出: 所有元素之和。

样例:

输入输出
2 3
1 2 3
4 5 6
21

你的解答

main.cpp — 你的解答
「运行我的输入」用的自定义输入

判题在浏览器本地运行。死循环会在 3 秒后被自动中断 —— 但还是确保每个循环都有出口。代码随打随存。

卡住了?提示

提示 1 — 你并不需要二维数组

只是求和的话,每个值读进临时变量再加起来即可;之后还要回访元素才需要二维数组。

提示 2 — 嵌套循环,按行优先

for (i < rows) for (j < cols) { cin >> v; sum += v; } —— 输入按行到达。

题解(先自己试试!)
#include <iostream>
using namespace std;

int main() {
    int rows, cols;
    cin >> rows >> cols;
    int sum = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            int v;
            cin >> v;
            sum += v;
        }
    }
    cout << sum << endl;
    return 0;
}

进阶:只求主对角线之和,或做矩阵转置 —— 都需要你在本题里省掉的二维数组。

深度解析

为什么这样做对

嵌套循环的层数对齐数据的形状(行 × 列),这是所有二维问题的心智模型。而 C++ 按行优先存数组,所以循环顺序真的有缓存代价。

代价

O(r·c) 时间;边读边加就是 O(1) 额外空间。

常见错法

  • 把循环上下界写反(列在外、行在内)结果仍然对,但内存访问顺序全错——大矩阵上能慢好几倍。
  • int m[100][100] 放栈上是 40 KB,再大就直接爆栈,而不是给你一个体面的报错。

下一步

把一维的模式组合起来:数组最大值。

记住这两句

  • 循环顺序要跟内存顺序(行优先)一致。
  • 边读边加——矩阵根本不用留下来。
🐞 这段是错的 —— 点开,亲手让它挂一次

i < rows - 1 把最后一行漏掉了

#include <iostream>
using namespace std;

int main() {
    int rows, cols;
    cin >> rows >> cols;
    int sum = 0;
    for (int i = 0; i < rows - 1; i++) {
        for (int j = 0; j < cols; j++) {
            int v;
            cin >> v;
            sum += v;
        }
    }
    cout << sum << endl;
    return 0;
}