POJ 3106 Flip and Turn

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值