题目描述
矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。
在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。
矩阵的运算是数值分析领域的重要问题。
你需要维护一个元素均为正整数的 nn 阶矩阵,并支持以下几种操作:
- 将该矩阵转置,即沿主对角线翻转。
- 将该矩阵行循环移动kk次,即第11行移动至第k+1k+1行,第22行移动至第k+2k+2行……,第n−k+1n−k+1行移动至第11行……,第nn行移动至第kk行。
- 将该矩阵列循环移动kk次,即第11列移动至第k+1k+1列,第22列移动至第k+2k+2列……,第n−k+1n−k+1列移动至第11列……,第nn列移动至第kk列。
输入格式
第一行一个正整数 nn 表示矩阵大小。
随后 nn 行每行 nn 个空格隔开的整数,表示矩阵中的元素。
随后一行一个正整数 qq 表示操作次数。
随后 qq 行每行表示一个操作,形如 11 或 22 kk 或 33 kk。
输出格式
对于每组数据,输出 nn 行每行 nn 个空格隔开的整数,表示依次进行所有操作后矩阵中的元素。
数据范围
对于30%30%的数据,保证n,q≤10n,q≤10。
对于另外20%20%的数据,保证只有操作11。
对于100%100%的数据,保证1≤n,q≤1001≤n,q≤100,0≤k<n0≤k<n,矩阵中元素的值不超过109109。
输入样例:
2 1 2 3 4 2 1 2 1
输出样例:
2 4 1 3
模拟
分析
只实现行的循环移动
对于列的循环移动只需要:
- 先转置
- 然后行循环移动
- 在转置
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 110;
int g[N][N];
int tmp[N][N];
int n, q;
void zhuanz()
{
for(int i = 1; i <= n; i++)
for(int j = i; j <= n; j++)
swap(g[i][j], g[j][i]);
}
void row_shift(int k)
{
for(int i = 1; i + k <= n; i++)
for(int j = 1; j <= n; j++)
tmp[i+k][j] = g[i][j];
for(int i = 1; i <= k; i++)
for(int j = 1; j <= n; j++)
tmp[i][j] = g[n-k+i][j];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
g[i][j] = tmp[i][j];
}
void col_shift(int k)
{
zhuanz();
row_shift(k);
zhuanz();
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> g[i][j];
cin >> q;
while(q--)
{
int t;
int k;
cin >> t;
if(t == 1) zhuanz();
else if(t == 2)
{
cin >> k;
row_shift(k);
}
else
{
cin >> k;
col_shift(k);
}
// for(int i = 1; i <= n; i++)
// {
// for(int j = 1; j <= n; j++) printf("%d ", g[i][j]);
// puts("hhh");
// }
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++) printf("%d ", g[i][j]);
puts("");
}
return 0;
}