acwing 1336. 矩阵(模拟)

题目传送门

题目描述

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

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

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

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

  1. 将该矩阵转置,即沿主对角线翻转。
  2. 将该矩阵行循环移动kk次,即第11行移动至第k+1k+1行,第22行移动至第k+2k+2行……,第n−k+1n−k+1行移动至第11行……,第nn行移动至第kk行。
  3. 将该矩阵列循环移动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;
}

时间复杂度

参考文章

posted @ 2022-03-16 20:06  VanHope  阅读(33)  评论(0编辑  收藏  举报