思路是先做一个斜角轴对称,在做一个水平轴对称(z==1)或者竖直轴对称(z==0)。 试了一下样例还有几组自己写的样例都能过,请教一下各位为什么会爆零。
#include<bits/stdc++.h>
using namespace std;
const int N=600;
int a[N][N];
int n,m,x,y,r,z;
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
cin>>n>>m;
int p=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;++j)
a[i][j]=p++;
while(m--){
cin>>x>>y>>r>>z;
if(z==0){
int up=x-r,down=x+r;
int le=y-r,ri=y+r;
for(int i=up;i<=down;++i){
for(int j=le;j<=le+i-up;++j){
swap(a[i][j],a[j][i]);
}
}
for(int i=up;i<=down;++i)
for(int j=le;j<=(le+ri)/2;++j)
swap(a[i][j],a[i][ri-j+le]);
}
if(z==1){
int up=x-r,down=x+r;
int le=y-r,ri=y+r;
for(int i=up;i<=down;++i){
for(int j=le;j<=le+i-up;++j){
swap(a[i][j],a[j][i]);
}
}
for(int j=le;j<=ri;++j){
for(int i=up;i<=(up+down)/2;++i){
swap(a[i][j],a[down-i+up][j]);
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;++j)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}