# Array# Simulation# Matrix

b965 - 2. 矩陣轉換

🔗 前往 ZeroJudge 原題

題目描述

題目要求根據給定的矩陣 B 和一系列操作(旋轉和翻轉),計算原始矩陣 A。操作序列是從後到前執行的。

解題思路

這題的核心是模擬矩陣的旋轉和翻轉操作。程式碼中定義了 rotateflip 兩個函數,分別實現了矩陣的順時針旋轉 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;
}

Discussion