題目說明#
有一個經過一連串的翻轉和旋轉過的 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;
}
