进阶 · 二维数组
矩阵求和
读入一个 rows x cols 的矩阵,输出所有元素之和。第一道输入形状真正影响程序的嵌套循环题。
一句话答案先读行数和列数,再用两层循环把每个元素加起来 —— 内层循环每行要读 cols 个数,不是 rows 个。
题目
输入: 第一行:行数和列数。之后 rows 行,每行 cols 个整数。
输出: 所有元素之和。
样例:
| 输入 | 输出 |
|---|---|
2 31 2 34 5 6 | 21 |
你的解答
「运行我的输入」用的自定义输入
判题在浏览器本地运行。死循环会在 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;
}