• 洛谷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;
    }

    待补……

  • 相关阅读:
    枚举类型的应用
    动手动脑
    四则运算和验证码--源码
    ATM源码
    javabean+jsp+servlet+jdbc
    四则运算改良
    Java异常
    课后总结
    包装类Integre
    对象验证
  • 原文地址:https://www.cnblogs.com/sugewud/p/9824594.html
Copyright © 2020-2023  润新知