算法标签:
模拟 思维
问题描述
参考洛谷题干。https://www.luogu.com.cn/problem/P4924
原因分析:
看了大佬的一些题解,总结一下这个题的思路
对于本题 主要搞清楚矩阵是如何旋转的即可 矩阵的旋转可类似向量的旋转
对于(i,j)
1.顺时针旋转90° (j,-i)
2.逆时针旋转90° (-j,i)
AC代码:
//矩阵旋转类题目 模拟算法
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 510;
int a[N][N],b[N][N];
int n,m;
void tran(int x,int y,int r,int z){
//顺时针旋转90° (i,j)-> (j,-i)
if(z==0){
for(int i=-r;i<=r;i++){
for(int j=-r;j<=r;j++){
b[x+j][y-i] = a[x+i][y+j];
}
}
}
//逆时针旋转90° (i,j)-> (-j,i)
else{
for(int i=-r;i<=r;i++){
for(int j =-r;j<=r;j++){
b[x-j][y+i] = a[x+i][y+j];
}
}
}
memcpy(a,b,sizeof(b));
}
int main(){
int cnt = 1;
cin>> n >> m;
for(int i =1;i<=n;i++)
for(int j=1;j<=n;j++){
a[i][j] = cnt++;
}
memcpy(b,a,sizeof a);
while(m--){
int x,y,r,z;
cin>>x>>y>>r>>z;
tran(x,y,r,z);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
puts(" ");
}
return 0;
}