1. 程式人生 > 其它 >P4924 [1007]魔法少女小Scarlet

P4924 [1007]魔法少女小Scarlet

題目連結

https://www.luogu.com.cn/problem/P4924

題目思路

順時針轉是第\(i\)行第\(j\)列的數字轉移到第\(j\)行倒數第\(i\)
\(temp[n - m + j][n + m - i] = g[i][j]\)
逆時針轉是第\(i\)行第\(j\)列的數字轉移到倒數第\(j\)行第\(i\)
\(temp[n + m - j][m - n + i] = g[i][j]\)

題目程式碼

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 510;
int g[N][N], temp[N][N];
int n, m, t;

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i ++ )
        for(int j = 1; j <= n; j ++ )
            g[i][j] = ++ t;
    
    while(m -- )
    {
        int x, y, r, z;
        cin >> x >> y >> r >> z;
        if(z == 0)
        {
            for(int i = x - r; i <= x + r; i ++ )
                for(int j = y - r; j <= y + r; j ++ )
                    temp[x - y + j][x + y - i] = g[i][j];
            for(int i = x - r; i <= x + r; i ++ )
                for(int j = y - r; j <= y + r; j ++ )
                    g[i][j] = temp[i][j];
        }
        else 
        {
            for(int i = x - r; i <= x + r; i ++ )
                for(int j = y - r; j <= y + r; j ++ )
                    temp[x + y - j][y - x + i] = g[i][j];
            for(int i = x - r; i <= x + r; i ++ )
                for(int j = y - r; j <= y + r; j ++ )
                    g[i][j] = temp[i][j];
        }
    }
    
    for(int i = 1; i <= n; i ++ )
    {
        for(int j = 1; j <= n; j ++ )
            cout << g[i][j] << ' ';
        puts("");
    }
    return 0;
}