第一题:矩阵重塑(一)
本题有两种思路
第一种 (不确定是否正确 但是100分)
#include<iostream>
using namespace std;
int main(){int n,m,p,q,i,j;cin>>n>>m>>p>>q;int a[n][m];for(i=0;i<n;i++){for(j=0;j<m;j++){cin>>a[i][j];}}int ans=0;for(i=0;i<n;i++){for(j=0;j<m;j++){ans++;cout<<a[i][j]<<" ";if(ans%q==0){cout<<endl;}}}
}
第二种 哈希表 一对一对一(找到这两个矩阵之间的关系)
map<int,int>ok;int i,j;for(i=0;i<n;i++){for(j=0;j<m;j++){ok[i*m+j]=ans[i][j];}}for(i=0;i<p;i++){for(j=0;j<q;j++){ans[i][j]=ok[i*q+j]; }}
第二题 矩阵重塑(二)
这道题他的难点在于矩阵的大小是会随着操作进行改变,所以每次需要进行更新,长和宽,这里建议用vector,因为vector独特的性质,很适合,当时我当时考试的时候就是用 数组做的(因为编译器的原因),第一天题只是作为部分功能穿插在第二题中
代码如下
#include<iostream>
#include<map>
#include<vector>
using namespace std;
int ans[10000][10000];
int n,m;
void slove1(int p,int q){map<int,int>ok;int i,j;for(i=0;i<n;i++){for(j=0;j<m;j++){ok[i*m+j]=ans[i][j];}}for(i=0;i<p;i++){for(j=0;j<q;j++){ans[i][j]=ok[i*q+j]; }}n=p;m=q;
}
void slove2(){int a[m][n];int i,j;for(i=0;i<m;i++){for(j=0;j<n;j++){a[i][j]=ans[j][i];}}for(i=0;i<m;i++){for(j=0;j<n;j++){ans[i][j]=a[i][j];}}int tmp=n;n=m;m=tmp;
}
int main(){int t,i,j;cin>>n>>m>>t;for(i=0;i<n;i++){for(j=0;j<m;j++){cin>>ans[i][j];}}int op,p,q;while(t--){cin>>op>>p>>q;if(op==1){slove1(p,q);}if(op==2){slove2();}if(op==3){cout<<ans[p][q]<<endl;}}
}
可以把slove1()修改成如下
void slove1(int p,int q){int i,j;int nums[n][m];for(i=0;i<n;i++){for(j=0;j<m;j++){nums[i][j]=ans[i][j];}}for(i=0;i<n*m;i++){ans[i/p][i%q]=nums[i/n][i%n];}n=p;m=q;
}
可以参考leetcode
以上只能得80分
566. 重塑矩阵 - 力扣(LeetCode)