- C++
C++ 多维数组与枚举算法学习笔记
- 2025-7-19 19:53:17 @
C++ 多维数组与枚举算法学习笔记
一、多维数组(矩阵)操作
(一)矩阵交换行(题目01)
1. 需求分析
给定一个 5*5 的矩阵,输入要交换的两行编号 m
和 n
,交换这两行元素后输出新矩阵。
2. 代码实现与注释
#include<iostream>
using namespace std;
int main() {
// 定义 10x10 矩阵,给足空间存 5x5 数据,方便用 1 - 5 下标
int matrix[10][10];
// 输入矩阵数据,行和列从 1 开始计数,贴合题目输入习惯
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5; j++) {
cin >> matrix[i][j];
}
}
int m, n;
cin >> m >> n; // 输入要交换的行号
// 逐列交换 m 行和 n 行元素
for (int j = 1; j <= 5; j++) {
int temp = matrix[m][j]; // 临时存 m 行当前列数据
matrix[m][j] = matrix[n][j]; // n 行数据覆盖 m 行
matrix[n][j] = temp; // 临时数据放回 n 行
}
// 输出交换后的矩阵
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5; j++) {
cout << matrix[i][j] << " ";
}
cout << endl; // 每行结束换行
}
return 0;
}
3. 关键逻辑
- 数组下标从 1 开始,和题目输入行号对应,方便理解。
- 交换两行时,通过循环逐列操作,用临时变量
temp
完成数据交换,避免数据丢失。
(二)矩阵加法(题目08)
1. 需求分析
输入两个 n
行 m
列的矩阵 A
、B
,计算对应位置元素相加的结果矩阵并输出。
2. 代码实现与注释
#include<iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m; // 输入矩阵行数和列数
// 定义三个矩阵,a、b 存输入,c 存结果
int a[100][100], b[100][100], c[100][100];
// 输入矩阵 A 数据
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
// 输入矩阵 B 数据
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> b[i][j];
}
}
// 逐元素相加,存到结果矩阵 c
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
c[i][j] = a[i][j] + b[i][j];
}
}
// 输出结果矩阵 c
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << c[i][j];
// 除最后一个元素,其他元素后加空格
if (j < m - 1) cout << " ";
}
cout << endl; // 每行结束换行
}
return 0;
}
3. 关键逻辑
- 矩阵下标从 0 开始,是 C++ 数组默认习惯,循环更自然。
- 加法逻辑简单,对应位置相加;输出时通过
if (j < m - 1)
控制空格,让格式规范。
(三)矩阵转置(题目10)
1. 需求分析
输入 n
行 m
列矩阵 A
,输出 m
行 n
列的转置矩阵(行列下标互换 )。
2. 代码实现与注释
#include<iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m; // 输入原矩阵行列数
// 定义数组存矩阵,给足空间(200x200 足够存 100x100 数据 )
int a[200][200];
// 输入矩阵数据,行和列从 1 开始计数,方便后续转置逻辑
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
// 输出转置矩阵,外层循环列(原矩阵列变新矩阵行 )
for (int i = 1; i <= m; i++) {
// 内层循环行(原矩阵行变新矩阵列 )
for (int j = 1; j <= n; j++) {
// 原矩阵 a[j][i] 是转置后 a[i][j] 的值
cout << a[j][i] << " ";
}
cout << endl; // 每行结束换行
}
return 0;
}
3. 关键逻辑
- 转置核心是下标互换,原矩阵
a[i][j]
转置后在a[j][i]
位置。 - 输入用 1 开始下标,输出循环时,外层遍历原矩阵的列(成为新矩阵的行 ),内层遍历原矩阵的行(成为新矩阵的列 ),贴合转置逻辑。
(四)计算矩阵边缘元素之和(题目03)
1. 需求分析
输入矩阵,计算第一行、最后一行、第一列、最后一列元素的和(注意避免重复计算角落元素 )。
2. 代码实现与注释
#include<iostream>
using namespace std;
// 全局数组,存矩阵数据,空间足够存 100x100 矩阵
int a[200][200];
int main() {
int m, n;
cin >> m >> n; // 输入矩阵行列数
// 输入矩阵数据,行和列从 1 开始计数
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
int sum = 0; // 初始化和为 0
// 遍历矩阵每个元素
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
// 判断是否是边缘元素:行是第一/最后一行,或列是第一/最后一列
if (i == 1 || i == m || j == 1 || j == n) {
sum += a[i][j]; // 是边缘元素就累加
}
}
}
cout << sum << endl; // 输出边缘元素和
return 0;
}
3. 关键逻辑
- 用
if (i == 1 || i == m || j == 1 || j == n)
一次性判断边缘元素,简洁且能避免重复计算(比如(1,1)
只判断一次 )。 - 全局数组
a
放在main
外,能申请更大空间(避免栈空间不足 ),适合存较大矩阵。
二、枚举算法(基础题目)
枚举算法核心是“暴力尝试 + 条件筛选”,把所有可能情况列出来,逐个验证是否符合条件。以下是枚举类题目的通用思路:
- 确定枚举范围:比如鸡兔同笼中,鸡兔数量的可能区间;门牌号的合理数值范围等。
- 设置条件判断:遍历范围内的每个值,用题目条件(像头脚数量关系、门牌号乘积特征等 )筛选出正确结果。
以“鸡兔同笼”为例(伪代码思路 ):
// 已知头和脚总数,求鸡兔数量
int head = 35, foot = 94;
for (int chicken = 0; chicken <= head; chicken++) { // 鸡数量范围
int rabbit = head - chicken; // 兔数量由头总数推导
// 验证脚数量是否符合
if (chicken * 2 + rabbit * 4 == foot) {
cout << "鸡:" << chicken << " 兔:" << rabbit << endl;
}
}
其他枚举题(如 Cantor 表、找潜在朋友等 ),都可按照“定范围 + 验条件”的思路实现,多练习就能熟练掌握啦!
三、总结
本节课围绕多维数组操作和枚举算法展开:
- 多维数组(矩阵)部分,掌握了行交换、加法、转置、边缘和计算,核心是数组下标操作和逻辑遍历。
- 枚举算法部分,学会用“暴力尝试 + 条件筛选”解决问题,关键是找对枚举范围和验证条件。
这些知识是编程的基础积木,多敲代码练习(比如把枚举题都实现一遍 ),就能搭建更复杂的程序啦!继续加油,你们已经在编程路上稳步前进啦 ~
0 条评论
目前还没有评论...