POJ 3106 Flip and Turn

来源:互联网 发布:淘宝店铺类目是什么 编辑:程序博客网 时间:2024/04/29 20:45

首先这是一道模拟题, 由于数据量较大, 这里利用了小矩阵先进行模拟然后将结果映射到大矩阵的方法.

时间较慢, 需要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 1000000007int 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;}


0 0