b965 - 2. 矩陣轉換
題目描述
題目要求根據給定的矩陣 B 和一系列操作(旋轉和翻轉),計算原始矩陣 A。操作序列是從後到前執行的。
解題思路
這題的核心是模擬矩陣的旋轉和翻轉操作。程式碼中定義了 rotate 和 flip 兩個函數,分別實現了矩陣的順時針旋轉 90 度和上下翻轉操作。主函數讀取矩陣 B 的大小和內容,以及操作序列,然後從後到前依次執行操作,更新矩陣 d 的值。最後,輸出更新後的矩陣 d,即原始矩陣 A。旋轉操作需要注意行列的交換,翻轉操作則需要將矩陣的行反轉。
複雜度分析
- 時間複雜度: O(M * R * C),其中 M 是操作次數,R 是矩陣的行數,C 是矩陣的列數。因為每次操作(旋轉或翻轉)都需要遍歷整個矩陣。
- 空間複雜度: O(R * C),因為在旋轉和翻轉操作中,使用了額外的矩陣 b 來儲存中間結果,其大小與原始矩陣相同。
程式碼
#include <stdio.h>
#include <stdlib.h>
int d[10][10];
inline void prt(int R, int C){
for(int i = 0; i < R; ++i){
printf("%d", d[i][0]);
for(int j = 1; j < C; ++j)
printf(" %d", d[i][j]);
printf("\n");
}
}
inline void rotate(int R, int C){
int b[10][10],i, j;
for(i = 0; i < R; ++i)
for(j = 0; j < C; ++j)
b[C-1-j][i] = d[i][j];
for(i = 0; i < C; ++i)
for(j = 0; j < R; ++j)
d[i][j] = b[i][j];
}
inline void flip(int R, int C){
int b[10][10],i, j;
for(i = 0; i < R; ++i)
for(j = 0; j < C; ++j)
b[R-1-i][j] = d[i][j];
for(i = 0; i < R; ++i)
for(j = 0; j < C; ++j)
d[i][j] = b[i][j];
}
int main(void){
int R, C, M, op[10];
while (scanf("%d%d%d",&R, &C, &M) != EOF ){
for(int i = 0; i < R; ++i)
for(int j = 0; j < C; ++j)
scanf("%d", &d[i][j]);
for(int i = 0; i < M; ++i)
scanf("%d", &op[i]);
for(int i = M - 1; i >= 0; --i){
if(op[i] == 0){
rotate(R, C);
int t = R;
R = C;
C = t;
}
else
flip(R, C);
}
printf("%d %d\n", R, C);
prt(R, C);
}
return 0;
}