方碑旋转
题目描述:
在璃月的某处秘境中,派蒙发现了8个方碑,其中7个方碑不能做任何操作,剩下的一个方碑可以旋转,但每次旋转的角度固定为90°,这个解密似乎只要8个方碑的方向到正确的位置就能成功解开。
由于派蒙很笨,所以不知道如何旋转,最后旅行者告诉派梦旋转m次肯定能解开。(m大于0为逆时针旋转,小于0为顺时针旋转)
方碑的上方还有大小为n*n的图案,请问可旋转的方碑旋转后的图案形状?
输入描述:
输入一个n(0<n<=100);
输入n*n的矩阵(同行之间不含空格);
输入m(-1e9<=m<=1e9)。
输出描述:
输出一个n*n的矩阵。
示例1:
输入:
3
.*.
*.*
*..
1
输出
.*.
*..
.**
题解:
题目意思是将n*n的图形旋转m次后的结果输出,但旋转次数m的范围为(-1e9<=m<=1e9,m大于0为逆时针旋转,小于0为顺时针旋转),所以并不能直接暴力。虽然不能暴力,但也只需要取模就行了,因为逆时针旋转m次可以看作旋转m%4次,而顺时针旋转1次可以看作逆时针旋转3次。所以不管逆时针旋转还是顺时针旋转都可以用一个公式m=(m%4+4)%4,最后再把逆时针旋转实现就行了。
代码实现:
#include<bits/stdc++.h>
using namespace std;
const int N=107;
int n,m;
char arr[N][N];
void rotate() //逆时针旋转
{
char t[N][N];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
t[i][j]=arr[j][n-i+1];
memcpy(arr,t,sizeof t);
}
int main()
{
cin>>n;
string str;
for(int i=1;i<=n;i++)
{
cin>>str;
for(int j=1;j<=n;j++)
arr[i][j]=str[j-1];
}
cin>>m;
m=(m%4+4)%4;
for(int i=0;i<m;i++)
rotate();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<arr[i][j];
cout<<endl;
}
return 0;
}