1. 程式人生 > 其它 >acwing 1336. 矩陣(模擬)

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;
}

時間複雜度

參考文章