top1编程
← 返回题目
题解

矩阵交换行

1 条题解

  • 0
    @ 2026-8-5 0:54:47

    解题思路

    用二维数组 a[5][5] 存下整个 5×5 的矩阵。

    然后读入两个行号 m 和 n(注意行号是从 1 开始的),要把第 m 行和第 n 行整行互换。

    交换两行,需要一个“临时工”帮忙,就像把两个盒子里的东西对调,要先拿一个空盒子:

    1. 先把第 m 行的 5 个数全部搬到临时数组 t 里;
    2. 再把第 n 行的 5 个数搬到第 m 行;
    3. 最后把临时数组 t 里的数搬回第 n 行。

    因为数组下标从 0 开始,而行号从 1 开始,所以访问第 m 行时要写成 a[m-1]。

    参考代码

    // P4446 矩阵交换行:把 5x5 矩阵的第 m 行和第 n 行互换
    #include <iostream>
    using namespace std;
    
    int main() {
        int a[5][5];
        // 读入 5 行、每行 5 个数
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) cin >> a[i][j];
        }
        int m, n;
        cin >> m >> n;          // 要交换的两行编号(从 1 开始)
        // 借助临时数组 t 把第 m 行和第 n 行的数据互换
        int t[5];
        for (int j = 0; j < 5; j++) t[j] = a[m - 1][j];       // 先把第 m 行存到 t
        for (int j = 0; j < 5; j++) a[m - 1][j] = a[n - 1][j]; // 第 n 行放到第 m 行
        for (int j = 0; j < 5; j++) a[n - 1][j] = t[j];        // t 里的原第 m 行放到第 n 行
        // 输出交换后的矩阵
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (j > 0) cout << " ";
                cout << a[i][j];
            }
            cout << endl;
        }
        return 0;
    }
    

    复杂度分析

    矩阵固定是 5×5。

    • 时间:读入 25 个数、交换 5 个数、输出 25 个数,都是常数次操作,时间复杂度是 O(1)。
    • 空间:一个 5×5 的数组加一个长度为 5 的临时数组,空间复杂度是 O(1)。
    • 1