其实这题可以原地旋转卡常的,不用辅助数组……
#include <iostream>
#include <cstdio>
using namespace std;
int a[500][500];
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n,m,x,y,r,z,t;
int bx,by,w;
cin>>n>>m;
for(int i=0,k=1;i<n;i++)
{
for(int j=0;j<n;j++)
{
a[i][j]=k++;
}
}
for(int i=0;i<m;i++)
{
cin>>x>>y>>r>>z;
x--,y--;
bx=x-r,by=y-r,w=r<<1;
//printf("bx:%d by:%d w:%d\n",bx,by,w);
if(!z)
{
for(int j=0;j<r;j++)
{
for(int k=0;k<=r;k++)
{
t=a[j+bx][k+by];
a[j+bx][k+by]=a[w-k+bx][j+by];
a[w-k+bx][j+by]=a[w-j+bx][w-k+by];
a[w-j+bx][w-k+by]=a[k+bx][w-j+by];
a[k+bx][w-j+by]=t;
//printf("(%d,%d) (%d,%d) (%d,%d) (%d,%d)\n",j+bx,k+by,w-k+by,j+bx,w-j+bx,w-k+by,k+by,w-j+bx);
}
}
}
else
{
for(int j=0;j<r;j++)
{
for(int k=0;k<=r;k++)
{
t=a[j+bx][k+by];
a[j+bx][k+by]=a[k+bx][w-j+by];
a[k+bx][w-j+by]=a[w-j+bx][w-k+by];
a[w-j+bx][w-k+by]=a[w-k+bx][j+by];
a[w-k+bx][j+by]=t;
//printf("(%d,%d) (%d,%d) (%d,%d) (%d,%d)\n",j,k,n-k-1,j,n-j-1,n-k-1,k,n-j-1);
}
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<a[i][j]<<' ';
}
cout<<'\n';
}
return 0;
}
350 ms → 136 ms
2.38 MB → 1.39 MB
妙哉!