• C++
  • C++ 多维数组与枚举算法学习笔记

  • @ 2025-7-19 19:53:17

C++ 多维数组与枚举算法学习笔记

一、多维数组(矩阵)操作

(一)矩阵交换行(题目01)

1. 需求分析

给定一个 5*5 的矩阵,输入要交换的两行编号 mn,交换这两行元素后输出新矩阵。

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. 需求分析

输入两个 nm 列的矩阵 AB,计算对应位置元素相加的结果矩阵并输出。

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. 需求分析

输入 nm 列矩阵 A,输出 mn 列的转置矩阵(行列下标互换 )。

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 外,能申请更大空间(避免栈空间不足 ),适合存较大矩阵。

二、枚举算法(基础题目)

枚举算法核心是“暴力尝试 + 条件筛选”,把所有可能情况列出来,逐个验证是否符合条件。以下是枚举类题目的通用思路:

  1. 确定枚举范围:比如鸡兔同笼中,鸡兔数量的可能区间;门牌号的合理数值范围等。
  2. 设置条件判断:遍历范围内的每个值,用题目条件(像头脚数量关系、门牌号乘积特征等 )筛选出正确结果。

以“鸡兔同笼”为例(伪代码思路 ):

// 已知头和脚总数,求鸡兔数量
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 条评论

目前还没有评论...