当前位置: 代码迷 >> 综合 >> POJ 3106 Flip and Turn
  详细解决方案

POJ 3106 Flip and Turn

热度:27   发布时间:2024-01-12 05:24:26.0

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

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


  相关解决方案