c++有一个 n×n 的方阵,第 1 列、对角线和第 n 列可以构成一个 “N”字,请编程求出这个 “N” 字上所有元素的和。 N字.png 输入描述 第1行是一个正整数 n。 接下来 n 行,每行 n 个正整数,用空格隔开。数字不大于 1000。 输出描述 一个正整数。
样例输入 1
4 9 7 3 4 2 3 2 6 3 2 1 0 1 1 1 1
样例输出 1
30
要解决这个问题,我们需要遍历矩阵,只累加那些构成“N”字的元素。具体来说,“N”字包括以下几部分:
- 第一列的所有元素。
- 对角线上的所有元素(从左上到右下)。
- 最后一列的所有元素,除了对角线上的那个元素(因为它已经在第二部分被累加过了)。
我们可以通过以下步骤来实现这个算法:
- 读取输入的矩阵大小
n
和矩阵本身。 - 初始化一个变量
sum
来存储“N”字上所有元素的和。 - 遍历矩阵,累加第一列、对角线和最后一列(除了对角线上的元素)的元素。
- 输出最终的
sum
。
下面是实现这个算法的C++代码:
#include <iostream>
#include <vector>
int main() {
int n;
std::cin >> n;
std::vector<std::vector<int>> matrix(n, std::vector<int>(n));
// 读取矩阵
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
std::cin >> matrix[i][j];
}
}
int sum = 0;
// 累加第一列、对角线和最后一列(除了对角线上的元素)
for (int i = 0; i < n; ++i) {
sum += matrix[i][0]; // 第一列
sum += matrix[i][i]; // 对角线
if (i != n - 1 - i) { // 最后一列,除了对角线上的元素
sum += matrix[i][n - 1];
}
}
std::cout << sum << std::endl;
return 0;
}
解释
- 读取输入:首先读取矩阵的大小
n
,然后读取矩阵的每一行。 - 初始化
sum
:用于存储“N”字上所有元素的和。 - 遍历矩阵:
- 累加第一列的元素:
matrix[i][0]
- 累加对角线的元素:
matrix[i][i]
- 累加最后一列的元素,但要排除对角线上的元素(即
i == n - 1 - i
的情况):matrix[i][n - 1]
- 累加第一列的元素:
- 输出结果:最终输出
sum
。
这个算法的时间复杂度是 O(n),因为我们需要遍历矩阵的每一行。