1、http://codeforces.com/problemset/problem/400/C
2、题目大意:
给出一个n*m的矩阵,其中有p个格子里边有糖果,知道这p个格子现在的位置,现在要将这个n*m的矩阵顺时针旋转x次,水平翻转y次,逆时针旋转z次,最后输出原来的p个有糖果的格子现在的坐标
3、解题思路:
数据很大,首先能明白的是顺时针和逆时针旋转4次回归原来的,水平旋转2次回归原来的,所以x,y,z的大小最大是4即可,光明白这一点只能将大数据转换成小数据了,但是还是不能解决问题的,那么我们现在要做的就是拿一个矩阵旋转看他们坐标的变化,找出规律,我是用2*3举证做的
规律如下:(假设当前处理的坐标是(x,y))
顺时针旋转一次(x,y)--->(y,n+1-x)
顺时针旋转二次(x,y)--->(n+1-x,m+1-y)
顺时针旋转三次(x,y)--->(m+1-y,x)
顺时针旋转四次(x,y)--->(x,y)
水平翻转一次(x,y)--->(x,m+1-y)
水平翻转一次(x,y)--->(x,y)
逆时针旋转一次(x,y)--->(m+1-y,x)
逆时针旋转二次(x,y)--->(n+1-x,m+1-y)
逆时针旋转三次(x,y)--->(y,n+1-x)
逆时针旋转四次(x,y)--->(x,y)
有了这些就足够了,再稍微注意一下细节,就AC了
4、AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int main() { int n,m,X,Y,Z,p; int x,y; while(scanf("%d%d%d%d%d%d",&n,&m,&X,&Y,&Z,&p)!=EOF) { X%=4; Y%=2; Z%=4; int tn=n; int tm=m; for(int i=1;i<=p;i++) { n=tn; m=tm; scanf("%d%d",&x,&y); if(X==1) { int xx=x; x=y; y=n+1-xx; int nn=n; n=m; m=nn; } else if(X==2) { x=n+1-x; y=m+1-y; } else if(X==3) { int xx=x; x=m+1-y; y=xx; int nn=n; n=m; m=nn; } if(Y==1) { y=m+1-y; } if(Z==1) { int xx=x; x=m+1-y; y=xx; int nn=n; n=m; m=nn; } else if(Z==2) { x=n+1-x; y=m+1-y; } else if(Z==3) { int xx=x; x=y; y=n+1-xx; int nn=n; n=m; m=nn; } printf("%d %d\n",x,y); } } return 0; }