原题链接TUOJ (thusaac.com)
时间限制: 1.0 秒
空间限制: 512 MiB
相关文件: 题目目录(样例文件)
题解:对于n*m的矩阵,通过转置和重塑操作都可以使得矩阵形态变为m*n。我们先在脑海里用一维数组存储n*m的矩阵行主序信息和列主序信息,再将其分别进行转置和重塑操作后,比较新的到的m*n矩阵,会发现进行重塑操作不改变矩阵的行主序信息,转置操作则会改变原行主序为列主序。
此时,这道题的思路就出来了,考虑到t<10^5且转置操作不超过100次,因此我们可以使用一维数组存储矩阵信息,当重塑时不进行数组上的操作,仅记录当前重塑后的行和列的值,当转置时,使用一次二重循环将行主序数组转化为列主序数组。最后依靠行列坐标于一维数组下标之间的对应关系输出即可
参考代码
#include<bits/stdc++.h>using namespace std;int main(){ int n,m,t;cin>>n>>m>>t; int b[10010]; int c[10010]; for(int i=0;i<n*m;i++) { cin>>b[i]; c[i]=b[i]; } int row=n,line=m; for(int i=0;i<t;i++) { int op,x,y;cin>>op>>x>>y; if(op==1) { row=x;line=y; } else if(op==2) { int d[line+1][row+1]; for(int j=0;j<row;j++) { for(int k=0;k<line;k++) { c[k*row+j]=b[j*line+k]; } } for(int j=0;j<n*m;j++) { b[j]=c[j]; } int temp=row; row=line;line=temp; } else if(op==3) { cout<<b[x*line+y]<<endl; } } return 0;}