题目链接http://codeforces.com/problemset/problem/400/C
题意:给出一个(N,M)矩形和矩形里的p(p<=1e5)个点坐标,然后顺时针旋转x,镜面对称y次,再逆时针旋转z次。然后输出p个点坐标。
题解:顺时针旋转x次与顺时针旋转x%4次的效果是一样的,同理逆时针。镜面对称y次和镜面对称y%2次的效果也是一样的。但是这个坐标系跟普通的坐标系不一样,是以原点的右边为y轴的正方向,原点的下方为x轴的正方向。而且每次进行逆时针、顺时针旋转的时候,(N,M)都要交换一下,因为每次旋转都会改变矩形的长和宽。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 15; struct node { int x, y; } E[maxn]; int N, M, x, y, z, p; void turnx() { for(int i = 1; i <= p; i++) { int t = N + 1 - E[i].x; E[i].x = E[i].y; E[i].y = t; } swap(N, M); } void turny() { for(int i = 1; i <= p; i++) E[i].y = M + 1 - E[i].y; } void turnz() { for(int i = 1; i <= p; i++) { int t = M + 1 - E[i].y; E[i].y = E[i].x; E[i].x = t; } swap(N, M); } int main () { scanf("%d%d%d%d%d%d", &N, &M, &x, &y, &z, &p); for(int i = 1; i <= p; i++) { scanf("%d%d", &E[i].x, &E[i].y); } x %= 4; y %= 2; z %= 4; for(int i = 1; i <= x; i++) turnx(); if(y) turny(); for(int i = 1; i <= z; i++) turnz(); for(int i = 1; i <= p; i++) printf("%d %d ", E[i].x, E[i].y); return 0; }