掌握好矩阵旋转的方法很重要。
经过观察可以发现,矩阵的第i行和矩阵的第i列,在旋转前后是有关系的。
于是我们就可以把矩阵的列,按顺序填到矩阵的行上。
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int maxn = 510;
int a[maxn][maxn];
void gao(int x,int y,int r,int z)
{
int tmp[maxn][maxn] = {0};
if(z==0)
{
for(int i=x-r;i<=x+r;i++)
{
for(int j=y-r;j<=y+r;j++)
{
tmp[i][j] = a[i][j];
}
}
int nowx = x+r, nowy = y-r;
for(int i=x-r;i<=x+r;i++)
{
for(int j=y-r;j<=y+r;j++)
{
a[i][j] = tmp[nowx][nowy];
nowx--;
}
nowx = x+r;
nowy++;
}
}
else
{
for(int i=x-r;i<=x+r;i++)
{
for(int j=y-r;j<=y+r;j++)
{
tmp[i][j] = a[i][j];
}
}
int nowx = x-r, nowy = y+r;
for(int i=x-r;i<=x+r;i++)
{
for(int j=y-r;j<=y+r;j++)
{
a[i][j] = tmp[nowx][nowy];
nowx++;
}
nowx = x-r;
nowy--;
}
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int cnt = 0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
a[i][j] = ++cnt;
}
}
for(int i=0;i<m;i++)
{
int x,y,r,z;
scanf("%d%d%d%d",&x,&y,&r,&z);
gao(x,y,r,z);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}