原理

问题目标:给定一个5x5的矩阵和两个行号mn,交换矩阵的第m行和第n行,并输出交换后的矩阵。

核心思路

  • 直接通过索引交换两行的所有元素。
  • 使用临时数组保存其中一行的数据,避免覆盖丢失。

步骤

  1. 输入矩阵:读取5行,每行5个整数,构成5x5矩阵。
  2. 输入行号:读取要交换的行号mn(从1开始计数)。
  3. 交换行元素
    • 用临时数组保存第m行元素。
    • 将第n行元素覆盖到第m行。
    • 将临时数组中的元素覆盖到第n行。
  4. 输出结果:按行打印交换后的矩阵。

图示法表示步骤(示例:m=2n=4

  1. 原始矩阵
    1  2  3  4  5  
    6  7  8  9 10  
    11 12 13 14 15  
    16 17 18 19 20  
    21 22 23 24 25  
  2. 交换第2行和第4行
    • 保存第2行到临时数组:11 12 13 14 15
    • 将第4行复制到第2行:第2行变为21 22 23 24 25
    • 将临时数组复制到第4行:第4行变为11 12 13 14 15
  3. 最终矩阵:wn
    1  2  3  4  5  
    21 22 23 24 25  
    11 12 13 14 15  
    16 17 18 19 20  
    6  7  8  9 10  

代码关键行注释

// 定义5x5矩阵  
vector<vector<int>> matrix(5, vector<int>(5,0));  

// 读取矩阵输入  
for(int i=0; i<5; i++){  
    for(int j=0; j<5; j++){  
        cin >> matrix[i][j];  
    }  
}  

// 输入要交换的行号m和n(从1开始)  
int m, n;  
cin >> m >> n;  

// 交换两行:用临时数组保存第m-1行,再交换  
vector<int> temp(5,0);  
for(int i=0; i<5; i++){  
    temp[i] = matrix[m-1][i];  // 保存原第m行  
    matrix[m-1][i] = matrix[n-1][i];  // 第n行覆盖到第m行  
    matrix[n-1][i] = temp[i];  // 临时数组覆盖到第n行  
}  

完整代码程序


#include <iostream>
#include <vector>

using namespace std;

int main(){
    vector<vector<int>> matrix(5,vector<int>(5,0));
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            cin>>matrix[i][j];
        }
    }
    int m,n;
    cin>>m>>n;

    vector<int> temp(5,0);
    for(int i=0;i<5;i++){
        temp[i]=matrix[m-1][i];
    }
    for(int i=0;i<5;i++){
        matrix[m-1][i]=matrix[n-1][i];
    }
    for(int i=0;i<5;i++){
        matrix[n-1][i]=temp[i];
    }

    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            cout<<matrix[i][j]<<" ";
        }
        cout<<endl;
    }

    return 0;
}

时间复杂度

  • 时间复杂度:O(1),固定处理5x5矩阵,所有操作均为常数时间。
  • 空间复杂度:O(1),固定使用5x5矩阵和临时数组。

总结

  1. 代码特点
    • 直接交换:通过遍历每列元素直接完成行交换,逻辑简单高效。
    • 正确处理索引:将用户输入的1基行号转换为0基索引(m-1n-1)。
  2. 潜在优化
    • 无需优化,输入规模固定,代码已足够高效。
  3. 适用场景
    • 适用于矩阵行交换问题,尤其是固定规模的矩阵操作。
Logo

集算法之大成!助力oier实现梦想!

更多推荐