首先这是一道模拟题, 由于数据量较大, 这里利用了小矩阵先进行模拟然后将结果映射到大矩阵的方法.
时间较慢, 需要454ms. 将就着看吧...
更快的做法是先将所有操作拆分成数个基本操作: 即沿主对角线翻折和水平翻折. 然后利用栈模拟并抵销相同的基本操作完成简化, (详见某红书)
当然还有另一种理论更快的做法, 这里先挖个坑, 下次再写, 目测速度可达45ms以内.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MAXN 100005
#define For(i,m,n) for(i=m;i<n;i++)
#define MOD 1000000007
int r[2][2]={1,2,3,4};
void swap(int *x, int *y)
{
int t;
t=*x; *x=*y; *y=t;
}
void op1()
{
swap(&r[0][1],&r[1][0]);
}
void op2()
{
swap(&r[0][0],&r[1][1]);
}
void opH()
{
swap(&r[0][0],&r[1][0]);
swap(&r[0][1],&r[1][1]);
}
main()
{
int i, j, m, n, flag, ti, tj, cnt=0;
char ch, map[330][330];
scanf("%d%d",&m,&n);
getchar();
For(i,0,m) gets(map[i]);
while(scanf("%c",&ch),ch!='\n'){
if(ch=='1') op1(),cnt++;
if(ch=='2') op2(),cnt++;
if(ch=='H') opH();
if(ch=='V') op1(),op2(),opH();
if(ch=='A'||ch=='Z') op2(),opH(),cnt++;
if(ch=='B'||ch=='Y') op1(),op2();
if(ch=='C'||ch=='X') op1(),opH(),cnt++;
}
if(cnt%2) swap(&m,&n);
if(r[0][0]==1&&r[0][1]==2&&r[1][0]==3) flag=1;
if(r[0][0]==1&&r[0][1]==3&&r[1][0]==2) flag=2;
if(r[0][0]==2&&r[0][1]==1&&r[1][0]==4) flag=3;
if(r[0][0]==2&&r[0][1]==4&&r[1][0]==1) flag=4;
if(r[0][0]==3&&r[0][1]==1&&r[1][0]==4) flag=5;
if(r[0][0]==3&&r[0][1]==4&&r[1][0]==1) flag=6;
if(r[0][0]==4&&r[0][1]==2&&r[1][0]==3) flag=7;
if(r[0][0]==4&&r[0][1]==3&&r[1][0]==2) flag=8;
printf("%d %d\n",m,n);
For(i,0,m){
For(j,0,n){
if(flag==1) ti=i, tj=j;
if(flag==2) ti=j, tj=i;
if(flag==3) ti=i, tj=n-j-1;
if(flag==4) ti=j, tj=m-i-1;
if(flag==5) ti=n-j-1, tj=i;
if(flag==6) ti=m-i-1, tj=j;
if(flag==7) ti=n-j-1, tj=m-i-1;
if(flag==8) ti=m-i-1, tj=n-j-1;
printf("%c",map[ti][tj]);
}
puts("");
}
return 0;
}