2.矩陣翻轉
題解
題目說給的是==已翻轉的==的矩陣,所以我們要從翻轉步驟去逆推原矩陣,因為翻轉恆是翻轉,所以不需要特別處理,但是向右旋轉逆推要變成向左旋轉,這點要特別注意
我們在rev函式裡面去做翻轉的動作,把矩陣從最下方讀到最上方,並且加入out
我們在rec函式裡面去做旋轉的動作,想左旋轉就是把第一列變成第一直排,以此類推
最後輸出原矩陣的長與寬和原矩陣即是答案
AC Code
python
from sys import stdin
r,c,m=map(int,stdin.readline().strip().split())
row=[list(map(int,stdin.readline().strip().split())) for _ in range(r)]
turn=reversed(list(map(int,stdin.readline().strip().split())))
def rev(data):
out=[]
for i in range(len(data)-1,-1,-1):
out.append(data[i])
return out
def rec(data):
out=[[0]*len(data) for _ in range(len(data[0]))]
for j in range(len(data[0])-1,-1,-1):
for i in range(len(data)):
out[len(data[0])-j-1][i]=data[i][j]
return out
for i in turn:
if i==0:
row=rec(row)
elif i==1:
row=rev(row)
print(len(row),end=" ")
print(len(row[0]))
for i in row:
print(*i)
C++
#include<bits/stdc++.h>
using namespace std;
vector<vector<int>> rev(const vector<vector<int>>& data){
vector<vector<int>> out;
for(int i=data.size()-1;i>=0;i--) out.push_back(data[i]);
return out;
}
vector<vector<int>> rec(const vector<vector<int>>& data){
vector<vector<int>> out;
for(int i=data[0].size()-1;i>=0;i--){
vector<int> temp;
for(int j=0;j<data.size();j++){
temp.push_back(data[j][i]);
}
out.push_back(temp);
}
return out;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int r,c,m;
cin>>r>>c>>m;
vector<vector<int>> row;
for(int i=0;i<r;i++){
vector<int> temp;
for(int j=0;j<c;j++){
int x;cin>>x;
temp.push_back(x);
}
row.push_back(temp);
}
vector<int> turn;
for(int i=0;i<m;i++){
int x;
cin>>x;
turn.push_back(x);
}
reverse(turn.begin(),turn.end());
for(auto i:turn){
if(i==0) row=rec(row);
else if(i==1) row=rev(row);
}
cout<<row.size()<<" "<<row[0].size()<<endl;
for(const auto& i : row){
for(int j=0;j<i.size();++j){
cout<<i[j]<<(j==i.size()-1?"":" ");
}
cout<<endl;
}
}