0%

APCS-矩陣轉換

題解

這題跟留社考時的翻轉螢幕很像
要把陣列轉啊轉,原本要使用 vector 卻不熟 vector的二維陣列
後來回來用了陣列。

其實這題比較難的地方在於陣列其中的關係,只要找到以後寫成兩個function,再依照順序呼叫即可。
陣列的N,M要注意一下旋轉時要交換。

Hack

  • 行尾不空白 特別的寫法 @chyyen

    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            cout << a[i][j] << " \n"[j==m-1];
  • 神奇的Vector寫法 @chyyen

    vector<vector<int>> a(n, vector<int>(m));
        for(auto &i:a)
            for(auto &j:i)
                cin >> j; 

    心得

  • 要記得把題目看好,他要回推,不是照著解

  • 不要害怕會超時或有太多顧慮,寫就對了

  • 心平氣和地把輸入輸出寫出來,推出其中的關係(在多維陣列轉換時尤其重要)

Code

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

int A[100][100];
int B[100][100];
int N,M;

void flip(){
    for(int i=0;i<N;i++)
        for(int j=0;j<M;j++)
            B[i][j] = A[i][j];

    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            A[i][j] = B[N-i-1][j];
        }
    }
}

void rotate(){
    for(int i=0;i<N;i++)
        for(int j=0;j<M;j++)
            B[i][j] = A[i][j];

    for(int i=0;i<M;i++){
        for(int j=0;j<N;j++) {
            A[i][j] = B[j][M-i-1];
        }
    }
}

int main() {

    int K;
    while(cin >> N >> M >> K){
        for(int i=0;i<N;i++){
            for(int j=0;j<M;j++){
                cin >> A[i][j];
            }
        }

        vector<int >op;

        for(int i=0;i<K;i++) {
            int k;
            cin >> k;
            op.emplace_back(k);
        }
        reverse(op.begin(), op.end());
        for(auto k : op){
            if(k==0){
                rotate();
                swap(N, M);
            }else{
                flip();
            }

            // *************** //
            /*cout << "**************" << endl;
            cout << N << " " << M << endl;

            for(int m=0;m<N;m++){
                for(int n=0;n<M;n++){
                    cout << A[m][n] << (n==M-1?"":" ");
                }
                cout << endl;
            }*/
            // *************** //
        }

        cout << N << " " << M << endl;

        for(int i=0;i<N;i++){
            for(int j=0;j<M;j++){
                cout << A[i][j] << (j==M-1?"":" ");
            }
            cout << endl;
        }

    }



    return 0;
}