P4924 [1007] 魔法少女小Scarlet

题目描述

Scarlet 最近学会了一个数组魔法,她会在 二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转

首先,Scarlet 会把 的正整数按照从左往右,从上至下的顺序填入初始的二维数组中,然后她会施放一些简易的魔法。

Scarlet 既不会什么分块特技,也不会什么 Splay 套 Splay,她现在提供给你她的魔法执行顺序,想让你来告诉她魔法按次执行完毕后的二维数组。

输入格式

第一行两个整数 ,表示方阵大小和魔法施放次数。

接下来 行,每行 个整数 ,表示在这次魔法中,Scarlet 会把以第 行第 列为中心的 阶矩阵按照某种时针方向旋转,其中 表示顺时针, 表示逆时针。

输出格式

输出 行,每行 个用空格隔开的数,表示最终所得的矩阵

输入输出样例 #1

输入 #1

5 4
2 2 1 0
3 3 1 1
4 4 1 0
3 3 2 1

输出 #1

5 10 3 18 15
4 19 8 17 20
1 14 23 24 25
6 9 2 7 22
11 12 13 16 21

说明/提示

对于50%的数据,满足

对于100%的数据 ,满足

题解

思路分析

就纯暴力模拟

AC代码

#include <bits/stdc++.h>

using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using u128 = unsigned __int128;
using namespace std;

void solve()
{
    int n, m;
    cin >> n >> m;
    vector<vector<int>> a(n + 1, vector<int>(n + 1, 0));

    int p = 1;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            a[i][j] = p;
            p++;
        }
    }
    while (m--)
    {
        int x, y, r, z;
        vector<vector<int>> ans(n + 1, vector<int>(n + 1, 0));
        cin >> x >> y >> r >> z;
        if (z == 0) // 顺时针
        {
            for (int i = x - 1 - r; i <= x - 1 + r; i++)
            {
                for (int j = y - 1 - r; j <= y - 1 + r; j++)
                {
                    ans[x - y + j][x + y - 2 - i] = a[i][j];
                }
            }
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if ((i >= x - 1 - r) && (i <= x - 1 + r))
                    {
                        if ((j >= y - 1 - r) && (j <= y - 1 + r))
                        {
                            continue;
                        }
                    }
                    ans[i][j] = a[i][j];
                }
            }

            a = ans;
        }
        else if (z == 1) // 逆时针
        {

            for (int i = x - 1 - r; i <= x - 1 + r; i++)
            {
                for (int j = y - 1 - r; j <= y - 1 + r; j++)
                {
                    ans[x + y - 2 - j][y - x + i] = a[i][j];
                }
            }
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if ((i >= x - 1 - r) && (i <= x - 1 + r))
                    {
                        if ((j >= y - 1 - r) && (j <= y - 1 + r))
                        {
                            continue;
                        }
                    }
                    ans[i][j] = a[i][j];
                }
            }

            a = ans;
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
    return;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t = 1;
    // cin >> t;

    while (t--)
    {
        solve();
    }

    return 0;
}