第一题:矩阵重塑(一)
本题有两种思路
第一种 (不确定是否正确 但是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)