快轉到主要內容

矩陣轉換

目錄

題目連結

題目說明
#

有一個經過一連串的翻轉和旋轉過的 i * j 矩陣 X ,請推回原本的矩陣。
翻轉:即第一列與最後一列交換、第二列與倒數第二列交換、… 依此類推。
旋轉:將矩陣以順時針方向轉 90 度。
注意 : 題目輸入為多筆測資,但並未提及測資數量 !
本題為嚴格比對,每一行的最後一個數字後並無空白,請務必按照說明進行輸出。

解題過程
#

因為有多筆測資,所以要用 for 迴圈輸入,題目有說最大的矩陣行列為 10 * 10,可以直接開 11 * 11 的陣列。

    int x, y, t;
    while (cin >> x >> y >> t) {
        int arr[11][11] = {};
        int change[11][11] = {};
        int time[t] = {};
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                cin >> arr[i][j];
            }
        }
        for (int i = 0; i < t; i++) {
            cin >> time[i]; 
        }

注意 : 動作需翻轉然後由後往前推 !
翻轉的反操作依然是翻轉,只要以中間一列為中心交換列就好, ex: (0, 0)和(5, 0)交換。
旋轉則要將矩陣以逆時針方向轉 90 度才會跟題目相反,可以試著自己模擬一次。

由圖可知旋轉後,「列座標」會變成「行座標」,座標 (𝑖, 𝑗) 變成 (𝑗, x−1−𝑖) ,這部分開一個跟 arr 一樣大小的陣列 change 比較好進行旋轉。

        for (int i = 0; i < t; i++) {
            if (time[t - i - 1] == 1) {
                for (int i = 0; i < x / 2; i++) {
                    for (int j = 0; j < y; j++) {
                        swap(arr[i][j], arr[x - i - 1][j]);
                    }
                }
            } else {
                for (int i = 0; i < x; i++) {
                    for (int j = 0; j < y; j++) {
                        change[i][j] = arr[i][j];
                    }
                }
                swap(x, y);
                for (int i = 0; i < x; i++) {
                    for (int j = 0; j < y; j++) {
                        arr[i][j] = change[j][x - i - 1];
                    }
                }
            }
        }

最後在注意一下嚴格比對的部分並輸出

        cout << x << ' ' << y << endl;
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                if (j == y - 1) cout << arr[i][j];
                else cout << arr[i][j] << ' ';
            }
            cout << endl;
        }

程式碼就完成了 !
完整程式碼如下

#include <bits/stdc++.h>
using namespace std;

int main() {
    int x, y, t;
    while (cin >> x >> y >> t) {
        int arr[11][11] = {};
        int change[11][11] = {};
        int time[t] = {};
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                cin >> arr[i][j];
            }
        }
        for (int i = 0; i < t; i++) {
            cin >> time[i];
        }
        for (int i = 0; i < t; i++) {
            if (time[t - i - 1] == 1) {
                for (int i = 0; i < x / 2; i++) {
                    for (int j = 0; j < y; j++) {
                        swap(arr[i][j], arr[x - i - 1][j]);
                    }
                }
            } else {
                for (int i = 0; i < x; i++) {
                    for (int j = 0; j < y; j++) {
                        change[i][j] = arr[i][j];
                    }
                }
                swap(x, y);
                for (int i = 0; i < x; i++) {
                    for (int j = 0; j < y; j++) {
                        arr[i][j] = change[j][x - i - 1];
                    }
                }
            }
        }
        cout << x << ' ' << y << endl;
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                if (j == y - 1) cout << arr[i][j];
                else cout << arr[i][j] << ' ';
            }
            cout << endl;
        }
    }
    return 0;
}
Piau 的筆記本
作者
Piau 的筆記本
希望我寫下來的東西能夠長久的記在我的腦中