zoukankan      html  css  js  c++  java
  • 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
    ", E[i].x, E[i].y);
        return 0;
    }
    想的太多,做的太少。
  • 相关阅读:
    每天都感觉很疲劳
    如果你决定要自己营销
    昨天忘记写日记了,今天补充一下!
    终于不用再去北仑了
    良好的程序架构
    最近的天气反复无常
    就这么着
    C# Socket 入门3 UPD
    让程序只启动一次 Mutex
    C# Socket 入门2
  • 原文地址:https://www.cnblogs.com/pealicx/p/6477726.html
Copyright © 2011-2022 走看看