CF400C/[思维题]

题目链接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\n", E[i].x, E[i].y);
    return 0;
}

 

posted @ 2017-02-28 10:35  _Mickey  阅读(182)  评论(0编辑  收藏  举报