艹,一开始数组开小了,粗心啊
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 510;
int x,y,r,z,n,m;
int a[N][N],b[N*N]; //数字开小了
int main()
{
scanf("%d%d", &n, &m);
int cnt = 1;
for(int i=1; i<=n;i++ )
for(int j=1; j <= n; j++)
a[i][j]= cnt++;
while(m--)
{
cnt = 0;
scanf("%d%d%d%d", &x,&y,&r,&z);
if(z==0)//顺时针转
{
for(int i = y-r; i <=y+r; i++)//固定列
for(int j = x+r; j>=x-r; j--)//遍历行
b[cnt ++] = a[j][i];//无论如何,一定是a[行][列]! 列是外层循环
}
else//逆时针转
{
for(int i = y+r; i >= y-r; i --)
for(int j = x-r; j <= x+r; j++)
b[cnt++] = a[j][i];//列是外层循环,先读列,再读行
}
cnt = 0;
for(int i = x-r; i <= x+r; i++)//固定行
for(int j = y-r; j <= y+r; j++)//遍历列
a[i][j] = b[cnt++];
}
for(int i = 1; i <= n; i ++)
{
for(int j = 1 ; j <= n ; j ++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}