题目
TUOJ
https://sim.csp.thusaac.com/contest/34/problem/1

思路
如果会写矩阵转置,这题很容易拿满
代码
可以让AI总结一下代码逻辑
1. 核心数据结构
-
A[N][N]:存储矩阵数据(最大 10000×10000) -
p, q:实时记录矩阵的当前行数 和列数 -
n, m:初始行数、列数 -
t:操作次数
2. 三种操作类型
操作1:矩阵重塑(reshape)
-
将当前
p×q的矩阵按行优先展开成一维数组 -
再按行优先填充到新的
a×b矩阵中 -
更新
p = a, q = b
操作2:矩阵转置
-
将当前矩阵转置(行列互换)
-
使用辅助矩阵
temp完成转置 -
更新
p, q(交换行列数)
操作3:矩阵查询
- 直接输出
A[a][b]位置的元素(下标从0开始)
3. 执行流程
-
读入初始矩阵大小
n, m和操作次数t -
读入初始矩阵到
A -
循环执行
t次操作:-
根据
op值执行对应操作 -
操作1和2会改变矩阵形状和
p, q的值 -
操作3直接输出查询结果
-
4. 关键特点
-
动态形状:矩阵的行列数会随操作变化
-
原地修改 :操作1和2都直接修改
A矩阵 -
实时记录 :
p, q始终记录当前矩阵的实际大小
cpp
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
int n,m,t, p, q; //p,q是真实的行/列
const int N=1e4+5; //warn : 必须const
int A[N][N];
void print()
{
for(int i=0;i<p;i++)
{
for(int j=0;j<q;j++)
cout<<A[i][j]<<" ";
cout<<endl;
}
}
void solve()
{
cin>>n>>m>>t;
p=n, q=m;
for(int i=0;i<p;i++)
for(int j=0;j<q;j++)
cin>>A[i][j];
while(t--)
{
int op,a,b; cin>>op>>a>>b;
if(op==1) //如果op==3时直接通过一维数组查询,这里改下p和q即可
{
int temp[p*q+5]={};
int cnt=0;
for(int i=0;i<p;i++)
for(int j=0;j<q;j++)
temp[cnt++]=A[i][j];
cnt=0;
for(int i=0;i<a;i++)
for(int j=0;j<b;j++)
A[i][j]=temp[cnt++];
p=a, q=b;
// print();
}
if(op==2)
{
//int temp[N][N]={}; //warn: N*N 太大了,本地跑不起来,oj上TLE只能80分,但是去掉"={}"是100
int temp[p][q]={};
for(int i=0;i<p;i++)
for(int j=0;j<q;j++)
temp[i][j]=A[i][j];
for(int i=0;i<q;i++)
for(int j=0;j<p;j++)
A[i][j]=temp[j][i];
swap(p,q);
// print();
}
if(op==3)
{
cout<<A[a][b]<<endl;
}
}
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
solve();
return 0;
}