# Array# Simulation# Matrix

b266 - 矩陣翻轉

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取一個 R 行 C 列的矩陣,並根據 M 個操作對其進行處理。操作包括旋轉(將矩陣順時針旋轉 90 度)和翻轉(將矩陣上下翻轉)。最後,輸出處理後的矩陣的行數、列數以及矩陣內容。

解題思路

這題主要考驗對二維陣列操作的理解。程式碼中定義了兩個函數 rotateflip,分別用於實現矩陣的旋轉和翻轉操作。旋轉操作通過創建一個新的二維陣列 b,將原始矩陣 d 的元素按照旋轉後的規則複製到 b 中,然後將 b 的內容複製回 d。翻轉操作類似,也是通過創建一個新的二維陣列 b,將原始矩陣 d 的元素按照翻轉後的規則複製到 b 中,然後將 b 的內容複製回 d。主函數中,根據輸入的操作序列,依次對矩陣進行旋轉或翻轉,最後輸出結果。

複雜度分析

  • 時間複雜度: 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