A. Mental Rotation
题目链接-Mental Rotation
题目大意
给你一个n*n的矩阵和一行命令L代表逆时针旋转,R代表顺时针旋转,旋转后相应的字符也会转变,求最终的图形是什么,
解题思路
- 模拟即可,先对字符串进行预处理,否则会超时
- LLLL或RRRR或LR都可视为矩阵不变,所以先把顺时针旋转次数和逆时针旋转次数记录,转4次之后会回到原位,所以都可以对4取余
- 逆时针1次=顺时针3次,所以又可以全部转化成顺时针旋转
- 用map记录一下字符顺时针旋转后对应的字符
- 写出一个move()函数模拟顺时针旋转,然后根据之前算的顺时针旋转次数调用函数即可
附上代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1010;
const int M=1e9+7;
typedef long long ll;
typedef pair<int,int> PII;
int n;
char a[N][N];
char b[N][N];
string s;
map<char,char> mp;
void move(){
for(int i=1;i<=n;i++)
for(int j=n;j>=1;j--)
b[i][n-j+1]=mp[a[j][i]];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=b[i][j];
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
mp['>']='v';
mp['<']='^';
mp['^']='>';
mp['v']='<';
mp['.']='.';
cin>>n>>s;
int r=0,l=0;
for(int i=0;i<s.length();i++){
if(s[i]=='L') l++;
if(s[i]=='R') r++;
}
if(r>=l){
r-=l;
r%=4;
}
else{
l-=r;
l%=4;
r=4-l;
r%=4;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
b[i][j]=a[i][j];
}
}
for(int i=0;i<r;i++)
move();
for(int i=1;i<=n;i++)
cout<<b[i]+1<<endl;
return 0;
}