CCF T3
CCF T3
没什么太特殊的,注意到全局旋转操作复杂度太高,考虑打个懒标记进行局部旋转。(别忘了对翻转标记进行旋转,因为这么一个唐诗问题调了2h我也是神人了)
#include<bits/stdc++.h>
using namespace std;
const int N=500,M=5e5+10;
int m,n,tag,nn,mm;
int mov[M];
char ch[N][N];
struct Node{
int opt,u,vd,Ll,dr,ro;
}op[M];
void Res(int pos){
for(int t=tag%4;t;t--){
int teml(op[pos].Ll),temr(op[pos].dr);
op[pos].Ll=op[pos].u;
op[pos].dr=op[pos].vd;
op[pos].vd=n-teml+1;// 反的
op[pos].u=n-temr+1;
op[pos].ro*=-1;
}
char buf[20][20];
memset(buf,0,sizeof(buf));
for(int i=op[pos].Ll;i<=op[pos].dr;++i){// lie
for(int j=op[pos].u;j<=op[pos].vd;++j){ //ceng
buf[j-op[pos].u+1][i-op[pos].Ll+1]=ch[j][i];
}
}
if(~op[pos].ro){// 上下翻转
int sum=op[pos].u+op[pos].vd;
for(int i=op[pos].Ll;i<=op[pos].dr;++i){
for(int j=op[pos].u;j<=op[pos].vd;++j){
ch[j][i]=buf[sum-j-op[pos].u+1][i-op[pos].Ll+1];
}
}
}else{// 左右翻转
int sum=op[pos].Ll+op[pos].dr;
for(int i=op[pos].u;i<=op[pos].vd;++i){
for(int j=op[pos].Ll;j<=op[pos].dr;++j){
ch[i][j]=buf[i-op[pos].u+1][sum-j-op[pos].Ll+1];
}
}
}
}
void Rol(int pos){
tag+=op[pos].ro;
for(int t=tag%4;t;t--){
int temv(op[pos].vd);
op[pos].vd=op[pos].u;
op[pos].u=n-temv-op[pos].Ll+2;// 反的
}
char buf[20][20];
memset(buf,0,sizeof(buf));
for(int i=op[pos].u;i<=op[pos].u+op[pos].Ll-1;++i){
for(int j=op[pos].vd;j<=op[pos].vd+op[pos].Ll-1;++j){
int ii=i-op[pos].u+1,jj=j-op[pos].vd+1;
buf[ii][jj]=ch[i][j];
}
}
if(op[pos].dr==90){
for(int i=op[pos].u;i<=op[pos].u+op[pos].Ll-1;++i){
for(int j=op[pos].vd;j<=op[pos].vd+op[pos].Ll-1;++j){
int ii=i-op[pos].u+1,jj=j-op[pos].vd+1;
ch[i][j]=buf[jj][op[pos].Ll-ii+1];
}
}
}else if(op[pos].dr==180){
for(int i=op[pos].u;i<=op[pos].u+op[pos].Ll-1;++i){
for(int j=op[pos].vd;j<=op[pos].vd+op[pos].Ll-1;++j){
int ii=i-op[pos].u+1,jj=j-op[pos].vd+1;
ch[i][j]=buf[op[pos].Ll-ii+1][op[pos].Ll-jj+1];
}
}
}else{
for(int i=op[pos].u;i<=op[pos].u+op[pos].Ll-1;++i){
for(int j=op[pos].vd;j<=op[pos].vd+op[pos].Ll-1;++j){
int ii=i-op[pos].u+1,jj=j-op[pos].vd+1;
ch[i][j]=buf[op[pos].Ll-jj+1][ii];
}
}
}
}
int main(){
// freopen("2.in","r",stdin);
// freopen("2.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n,mm=nn=n;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
cin>>ch[i][j];
}
}
cin>>m;
for(int i=1;i<=m;++i) cin>>mov[i];
for(int i=2;i<=m;i+=6){
op[i/6+1].opt=mov[i];
op[i/6+1].u=mov[i+1];
op[i/6+1].vd=mov[i+2];
op[i/6+1].Ll=mov[i+3];
op[i/6+1].dr=mov[i+4];
op[i/6+1].ro=mov[i+5];
}
for(int i=mov[1];i;i--){
if(op[i].opt==2) Res(i);
else Rol(i);
}
char buf_[N][N];
for(int t=tag%4;t;t--){
memset(buf_,0,sizeof(buf_));
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
buf_[i][j]=ch[i][j];
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
ch[i][j]=buf_[n-j+1][i];
}
}
}
for(int j=1;j<=n;++j){
if(ch[1][j]=='?'){
mm=j-1;
break;
}
}
for(int i=1;i<=n;++i){
if(ch[i][1]=='?'){
nn=i-1;
break;
}
}
for(int i=1;i<=nn;++i){
for(int j=1;j<=mm;++j) cout<<ch[i][j];
cout<<endl;
}
}
/*
3
649
712
583
19
3 1 2 2 2 180 2 2 1 3 2 3 -1 1 2 2 2 90 1
*/

浙公网安备 33010602011771号