Zerojudge b266

Zerojudge b266

題目

https://zerojudge.tw/ShowProblem?problemid=b266

給一個經過幾個操作的矩陣,求原本矩陣的長寬以及該矩陣

可行的操作包括

  • 翻轉
  • 旋轉

特別注意到,他要的是原本的矩陣所以所有操作都要反過來做

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include<iostream>
using namespace std;
int r,c,m,arr[15][15],op[15];
bool out=false;
void rotate(){
int tmp[15][15];
swap(r,c);
for(int i=0 ; i<r ; i++){
for(int j=0 ; j<c ; j++){
tmp[i][j] = arr[j][r-i-1];
}
}
swap(arr,tmp);
}
void mirror(){
int tmp[15][15];
for(int arr_x=r-1, tmp_x=0 ; arr_x>=0 ; arr_x--, tmp_x++){
for(int j=0 ; j<c ; j++){
tmp[tmp_x][j] = arr[arr_x][j];
}
}
swap(arr,tmp);
}
int main(){
while(cin>>r>>c>>m){
if(out){
cout<<"\n";
}
else{
out=true;
}
for(int i=0 ; i<r ; i++){
for(int j=0 ; j<c ; j++){
cin>>arr[i][j];
}
}
for(int i=0 ; i<m ; i++){
cin>>op[i];
}
for(int i=m-1 ; i>=0 ; i--){
if(op[i]==0){
rotate();
}
else{
mirror();
}
}
cout<<r<<" "<<c<<"\n";
for(int i=0 ; i<r ; i++){
for(int j=0 ; j<c ; j++){
if(j) cout<<' ';
cout<<arr[i][j];
}
cout<<"\n";
}
}
return 0;
}

時間複雜度分析

輸入時間複雜度為 $O(rc+m)$

翻轉與旋轉的時間複雜度皆為 $O(rc)$

每筆測資的時間複雜度為 $O(rc+m+mrc)$ 約為 $O(mrc)$