矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。
在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。
矩阵的运算是数值分析领域的重要问题。
你需要维护一个元素均为正整数的 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;
}