清华大学历年考研复试机试真题 - 矩阵

矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。

在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。

矩阵的运算是数值分析领域的重要问题。

你需要维护一个元素均为正整数的 n 阶矩阵,并支持以下几种操作:

将该矩阵转置,即沿主对角线翻转。
将该矩阵行循环移动k次,即第1行移动至第k+1行,第2行移动至第k+2行……,第n−k+1行移动至第1行……,第n行移动至第k行。
将该矩阵列循环移动k次,即第1列移动至第k+1列,第2列移动至第k+2列……,第n−k+1列移动至第1列……,第n列移动至第k列。
输入格式
第一行一个正整数 n 表示矩阵大小。

随后 n 行每行 n 个空格隔开的整数,表示矩阵中的元素。

随后一行一个正整数 q 表示操作次数。

随后 q 行每行表示一个操作,形如 1 或 2 k 或 3 k。

输出格式
对于每组数据,输出 n 行每行 n 个空格隔开的整数,表示依次进行所有操作后矩阵中的元素。

数据范围
对于30%的数据,保证n,q≤10。

对于另外20%的数据,保证只有操作1。

对于100%的数据,保证1≤n,q≤100,0≤k<n,矩阵中元素的值不超过109。

输入样例:
2
1 2
3 4
2
1
2 1
输出样例:
2 4
1 3

//矩阵转置 循环移动 行列变换

#include <stdio.h>
#define lenMAX 100
int mp[lenMAX][lenMAX];
void reverse(int n);               //矩阵转置
void rowshift(int n,int k);        //行循环下移 行列可以通过转置 来实现对方 本题用列实现行
void colshift(int n,int k);        //列循环右移
void swap(int *a,int *b);
int main(){
    int n,m,i,j,op,k,t;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        for(j=0;j<n;j++) scanf("%d",&mp[i][j]);
    }
    scanf("%d",&m);
    for(i=0;i<m;i++){
        scanf("%d",&op);
        if(op==1) reverse(n);
        else{
            scanf("%d",&k);
            if(op==2) rowshift(n,k);
            else colshift(n,k);
        }
    }
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%d",mp[i][j]);
            if(j!=n-1) printf(" ");
        }
        printf("\n");
    }
}
void reverse(int n){
    int i,j;
    for(i=0;i<n;i++){
        for(j=i+1;j<n;j++) swap(&mp[i][j],&mp[j][i]);
    }
}
void rowshift(int n,int k){
    reverse(n);
    colshift(n,k);
    reverse(n);
}
void colshift(int n,int k){
    k%=n;
    int i,j,p,t[k];
    for(i=0;i<n;i++){
        p=0;
        for(j=n-k;j<n;j++) t[p++]=mp[i][j];
        for(j=n-k-1;j>=0;j--) mp[i][j+k]=mp[i][j];
        for(j=0;j<k;j++) mp[i][j]=t[j];
    }
}
void swap(int *a,int *b){
    int t=*a;
    *a=*b;
    *b=t;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值