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;
}