CCF CSP 第34次(2024.06)(2_矩阵重塑(其二)_C++)(二维矩阵 -> 一维矩阵 -> 二维矩阵)

@[TOC](CCF CSP 第34次(2024.06)(2_矩阵重塑(其二)_C++))

时间限制: 1.0 秒
空间限制: 512 MiB
原题链接

请添加图片描述

解题思路:

思路一:

1、解题步骤拆分:
① 数据输入:

  • 第一行 n m t (n 和 m 分别代表矩阵的行和列,t代表t个操作)
  • 接下来n行输入 n*m 的矩阵。
  • 接下来t行输入t个操作 每行有三个整数,op p q 。
         若op为1则重塑矩阵为p*q大小。
         若op为2则矩阵进行转置。
         若op为3则查询p,q位置的元素。

② 数据处理:我们可以定义三个函数来实现重塑、转置和查询(M在不断的改变,所以我们进行函数传参的时候要进行 引用&)

  • 重塑我们可以想到 二维矩阵 -> 一维矩阵 -> 二维矩阵
  • 转置我们可以想到MT[j][i]=M[i][j]
  • 查询直接输出M[i][j]就可以

③ 数据输出:输出查询到的结果

代码实现

代码实现(思路一):
#include<iostream>
#include<vector>
using namespace std;

//矩阵重塑成p*q大小
void option1(vector<vector<int>> &M,int p,int q){
    
    
    //定义一个重塑后的矩阵(p*q大小)
    vector<vector<int>> M2(p,vector<int>(q));
    //n代表二维数组元素转换为一维数组的对应位置,row和col代表新的二维数组的坐标
    int n,row,col;
    for (int i = 0; i < M.size(); i++){
    
    
        for (int j = 0; j < M[0].size(); j++){
    
    
            //二维数组->一维数组->二维数组
            n=M[0].size()*i+j;
            row=n/q;
            col=n%q;
            M2[row][col]=M[i][j];
        }
    }
    //将重塑后的矩阵赋值给M
    M=M2;
}

//矩阵转置
void option2(vector<vector<int>> &M){
    
    
    vector<vector<int>> M2(M[0].size(),vector<int>(M.size()));

    for (int i = 0; i < M.size(); i++){
    
    
        for (int j = 0; j < M[0].size(); j++){
    
    
            //注意顺序不要写反了
            M2[j][i]=M[i][j];
        }
    }
    M=M2;
}

//输出M中坐标为p q的元素
int option3(vector<vector<int>> &M,int p,int q){
    
    
    return M[p][q];
}


int main(int argc, char const *argv[])
{
    
    
    int n,m,t;
    cin>>n>>m>>t;
    vector<vector<int>> M(n,vector<int>(m));

    //矩阵输入
    for (int i = 0; i < n; i++){
    
    
        for (int j = 0; j < m; j++){
    
    
            cin>>M[i][j];
        }
    }
    //op 为操作,p q为对应的操作数
    int op,p,q;
    //用于存储操作3查询到的结果
    vector<int> ans;

    //完成t次操作变化
    for (int i = 0; i < t; i++){
    
    
        cin>>op>>p>>q;
        //1操作,矩阵重塑成p*q大小
        if (op==1){
    
    
            option1(M,p,q);
        //2操作,矩阵转置
        }else if(op==2){
    
    
            option2(M);
        //3操作,输出M中坐标为p q的元素
        }else{
    
    
            //将答案存储在ans中
            ans.push_back(option3(M,p,q));
        }
        
    }
    //输出答案(操作3的查询结果)
    for (auto i:ans){
    
    
        cout<<i<<endl;
    }
    
    return 0;
}

部分代码解读

二维矩阵 -> 一维矩阵 -> 二维矩阵

for (int i = 0; i < M.size(); i++){
    
    
        for (int j = 0; j < M[0].size(); j++){
    
    
            //二维数组->一维数组->二维数组
            n=M[0].size()*i+j;
            row=n/q;
            col=n%q;
            M2[row][col]=M[i][j];
        }
    }

二维转一维的计算公式为:n = i * col_size + j
一维转二维的计算公式为:

  • i = n / col_size
  • j = n % col_size

列大小为:col_size
行大小为:row_size
二维数组中元素的位置为 [ i , j ]
一维数组的下标为 [ n ]

欢迎大家和我沟通交流(✿◠‿◠)