# 實作題 - 矩陣翻轉 - APCS - by Peter Wang ## 題目資訊 此題為2016.3.5測驗中的題目2 ###### tags: `APCS` ## 題目敘述 矩陣是將一群元素整齊的排列成一個矩形,在矩陣中的橫排稱為列 (row) ,直排稱為行 (column) ,其中以 Xij 來表示 矩陣X 中的第 i 列第 j 行的元素。 如圖一, X32 = 6 。 我們可以對矩陣定義兩種操作如下: 翻轉:即第一列與最後一列交換、第二列與倒數第二列交換、… 依此類推。 旋轉:將矩陣以順時針方向轉 90 度。 如圖一, 矩陣X 翻轉後可得到 Y ,將 矩陣Y 再旋轉後可得到 Z 。  一個 矩陣A 可以經過一連串的旋轉與翻轉操作後,轉換成 新矩陣B 。 如圖二, A 經過翻轉與兩次旋轉後,可以得到 B 。 給定 矩陣B 和一連串的操作,請算出原始的 矩陣A 。  ### 輸入: 輸入包含多筆測資。 每筆側資中, 第一行有三個介於 1~10 之間的正整數 R, C, M 。 接下來有 R 行(line)是 矩陣B 的 內容,每一行(line)都包含 C 個正整數,其中的第 i 行第 j 個數字代表 矩陣Bij 的值。 在矩陣內容後的一行有 M 個整數,表示對 矩陣A 進行的操作。 第 k 個整數 mk 代表第 k 個操作,如果 mk = 0 則代表旋轉, mk = 1 則代表翻轉。 同一行的數字之間都是以一個空白間格,且矩陣內容為 0~9 的整數。 其中 30%的測資滿足,每個操作都是翻轉。 其中100%的測資滿足,操作有翻轉也有旋轉。 ### 輸出: 每筆測資輸出包含兩個部分。 第一個部分有一行,包含兩個正整數 R' 和 C' ,以一個空白隔開,分別代表 矩陣A 的列數和行數。 接下來有 R' 行,每一行都包含 C' 個正整數,且每一行的整數之間以一個空白隔開,其中第 i 行的第 j 個數字代表 矩陣Aij 的值。 每一行的最後一個數字後並無空白。 本題為嚴格比對,請務必按照說明進行輸出。 ## 解題思路 想好旋轉與翻轉對應的規則,就能得到正確的答案。 我自己是先寫好翻轉與旋轉的函式,這樣比較能比較也比較好debug。 ## 程式碼 ```clike= #include <iostream> #include <string.h> using namespace std; int r,c,m; int arr[100][100]; int arr2[100][100]; void print(){ for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ if(j==c-1) cout<<arr[i][j]; else cout<<arr[i][j]<<" "; } cout<<endl; } } void rotate(){ int re=r;r=c;c=re; for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ arr[i][j]=arr2[j][r-i-1]; } } for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ arr2[i][j]=arr[i][j]; } } } void turn(){ for(int i=0;i<r/2;i++){ for(int j=0;j<c;j++){ int re=arr[i][j]; arr[i][j]=arr[r-i-1][j]; arr2[i][j]=arr[r-i-1][j]; arr[r-i-1][j]=re; arr2[r-i-1][j]=re; } } } int main(){ while(cin>>r>>c>>m){ for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ cin>>arr[i][j]; arr2[i][j]=arr[i][j]; } } int mm[m]; for(int i=0;i<m;i++){ cin>>mm[i]; } for(int i=m-1;i>=0;i--){ if(mm[i]==1){ turn(); } else{ rotate(); } } cout<<r<<" "<<c<<endl; print(); } } ``` ## 資料來源 [zerojudge](https://zerojudge.tw/) [題目敘述](https://zerojudge.tw/ShowProblem?problemid=b965) ## 備註 >[name=PeterWang] >[time=Sun, Aug 29, 2021 10:26 PM]
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up