我的思路是:
| 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|
| 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 |
| 每一次旋转都可以看作是几个圈的旋转 |
比如说3 3 2 0可以看作是
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int a[500][500],a1[500][500];
//a1是备用数组
int x,y,r,z;
int main()
{
cin>>n>>m;
int cnt=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a1[i][j]=a[i][j]=++cnt;
//输入数组
for(int i=1;i<=m;i++)
{
cin>>x>>y>>r>>z;
if(z==0)//顺时针
{
for(int j=1;j<=r;j++)//对于每一圈进行枚举
{
int x1=x-j,y1=y-j;
int x2=x+j,y2=y+j;
//每一圈边界
int c=2*j+1;
for(int k=x1;k<=x2;k++)
for(int l=y1;l<=y2;l++)
if(k==x1||l==y1||k==x2||l==y2)
{
int r1=j,k1,l1;
if(k==x1){l1=l+c-1;k1=x1+(l1-y2);l1=y2;}
else if(l==y2){k1=k+(c-1);l1=y2-(k1-x2);k1=x2;}
else if(k==x2){l1=l-(c-1);k1=x2-(y1-l1);l1=y1;}
else if(l==y1){k1=k-(c-1);l1=y1+(x1-k1);k1=x1;}
a1[k1][l1]=a[k][l];//进行旋转
}
}
}
if(z==1)//逆时针,下面注释同顺时针
{
for(int j=1;j<=r;j++)
{
int x1=x-j,y1=y-j;
int x2=x+j,y2=y+j;
int c=2*j+1;
for(int k=x1;k<=x2;k++)
for(int l=y1;l<=y2;l++)
if(k==x1||l==y1||k==x2||l==y2)
{
int r1=j,k1,l1;
if(k==x1){l1=l-(c-1);k1=x1+(y1-l1);l1=y1;}
else if(l==y1){k1=k+(c-1);l1=y1+(k1-x2);k1=x2;}
else if(k==x2){l1=l+(c-1);k1=x2-(l1-y2);l1=y2;}
else if(l==y2){k1=k-(c-1);l1=y2-(x1-k1);k1=x1;}
a1[k1][l1]=a[k][l];
}
}
}
int x1=x-r,x2=x+r;
int y1=y-r,y2=y+r;
for(int k=x1;k<=x2;k++)
for(int l=y1;l<=y2;l++)
a[k][l]=a1[k][l];
//用备用数组覆盖原数组
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}//输出
return 0;
}