2019 ICPC Malaysia National A. Mental Rotation

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;
}

发布了78 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/104305513
今日推荐