洛谷10月月赛II

#A: P4924 [1007]魔法少女小Scarlet

这道题考了矩阵旋转

其实很考验推公式的能力和代码能力

这里有个小技巧

可以设(x, y)为原点,然后去推公式,然后实际操作中横坐标加上x,纵坐标加上y就好了。

顺时针(i, j) -> (j, -i)

逆时针(i, j) -> (-j, i)

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std;

const int MAXN = 500 + 10;
int a[MAXN][MAXN], t[MAXN][MAXN];
int n, m;

void read(int& x)
{
    int f = 1; x = 0; char ch = getchar();
    while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar(); }
    while(isdigit(ch)) { x = x * 10 + ch - '0'; ch = getchar(); }
    x *= f;
}

void work(int x, int y, int r, int z)
{
    _for(i, -r, r)
        _for(j, -r, r)
        {
            if(z == 1) t[x+i][y+j] = a[x+j][y-i];
            else t[x+i][y+j] = a[x-j][y+i];
        }
        
    _for(i, -r, r)
        _for(j, -r, r)
            a[i+x][j+y] = t[i+x][j+y];
}

int main()
{
    read(n); read(m);
    _for(i, 1, n)
        _for(j, 1, n)
            a[i][j] = (i - 1) * n + j;
    
    while(m--)
    {
        int x, y, r, z;
        read(x); read(y); read(r); read(z);
        work(x, y, r, z);
    }
        
    _for(i, 1, n)
    {
        _for(j, 1, n)
            printf("%d ", a[i][j]);
        puts("");
    }
    
    return 0;
}

 

待补……

posted @ 2018-10-21 12:29  Sugewud  阅读(216)  评论(0编辑  收藏  举报