#41979: 叫gpt幫我寫解題報告,最後才發現是反向操作(感謝另一份解題報告)


010521@mail.pcsh.ntpc.edu.tw (Terry practice c++)

學校 : 新北市立板橋高級中學
編號 : 173875
來源 : [101.136.253.159]
最後登入時間 :
2024-10-20 12:51:07
b965. 2. 矩陣轉換 -- 2016年3月apcs | From: [101.136.159.24] | 發表日期 : 2024-09-15 21:10

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

int main() {
    int r, c, m, i, j, ii, jj;
    bool is_rc = 1;  // 用來標記當前矩陣的狀態是否為行數 * 列數
    cin >> r >> c >> m;  // 輸入行數、列數和操作數
    int mk[m];  // 存放操作的數組
    int arr_rc[r][c], arr_cr[c][r];  // 定義矩陣,兩個不同方向的版本

    // 填入矩陣 B 的初始內容
    for (i = 0; i < r; i++) {
        for (j = 0; j < c; j++) {
            cin >> arr_rc[i][j];
        }
    }

    // 填入 M 個操作 mk
    for (i = 0; i < m; i++) {
        cin >> mk[i];
    }

    // 按順序處理操作(反向處理)
    for (int k = m; k >= 0; k--) {
        if (mk[k] == 0) {
            // 若 mk[k] == 0,執行旋轉操作
            is_rc = !is_rc;
            if (is_rc) {
                // 轉換回行列矩陣,進行旋轉並更新 arr_rc
                for (i = 0; i < r; i++) {
                    for (j = 0; j < c; j++) {
                        ...  // 在這裡進行旋轉操作
                    }
                }
            } else {
                // 將矩陣轉換為列行矩陣,進行旋轉並更新 arr_cr
                for (i = 0; i < c; i++) {
                    for (j = 0; j < r; j++) {
                        ...  // 在這裡進行旋轉操作
                    }
                }
            }
        } else if (mk[k] == 1) {
            // 若 mk[k] == 1,執行翻轉操作
            if (is_rc) {
                int arr_rc_cpy[r][c];
                for (i = 0; i < r; i++) {
                    for (j = 0; j < c; j++) {
                        ...  // 在這裡進行翻轉操作,存入 arr_rc_cpy
                    }
                }
                // 將翻轉後的結果複製回 arr_rc
                for (i = 0; i < r; i++) {
                    for (j = 0; j < c; j++) {
                        ...  // 將翻轉後的矩陣更新到 arr_rc
                    }
                }
            } else {
                int arr_cr_cpy[c][r];
                for (i = 0; i < c; i++) {
                    for (j = 0; j < r; j++) {
                        ...  // 在這裡進行翻轉操作,存入 arr_cr_cpy
                    }
                }
                // 將翻轉後的結果複製回 arr_cr
                for (i = 0; i < c; i++) {
                    for (j = 0; j < r; j++) {
                        ...  // 將翻轉後的矩陣更新到 arr_cr
                    }
                }
            }
        }
    }

    // 根據當前矩陣狀態輸出最終結果
    if (is_rc) {
        cout << r << ' ' << c << endl;
        for (i = 0; i < r; i++) {
            cout << arr_rc[i][0];
            for (j = 1; j < c; j++) {
                cout << ' ' << arr_rc[i][j];
            }
            cout << endl;
        }
    } else {
        cout << c << ' ' << r << endl;
        for (i = 0; i < c; i++) {
            cout << arr_cr[i][0];
            for (j = 1; j < r; j++) {
                cout << ' ' << arr_cr[i][j];
            }
            cout << endl;
        }
    }
}

提示:

  • mk[k] == 0 時,代表矩陣需要旋轉 90 度,這時要注意行數和列數的轉換。
  • mk[k] == 1 時,代表矩陣需要上下翻轉,這時只需要反轉矩陣的順序即可。
 
ZeroJudge Forum