acwing 1336. 矩陣(模擬)
阿新 • • 發佈:2022-03-16
目錄
題目描述
矩陣是高等代數學中的常見工具,也常見於統計分析等應用數學學科中。
在物理學中,矩陣於電路學、力學、光學和量子物理中都有應用;電腦科學中,三維動畫製作也需要用到矩陣。
矩陣的運算是數值分析領域的重要問題。
你需要維護一個元素均為正整數的 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; }