@[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 ]
欢迎大家和我沟通交流(✿◠‿◠)