洛谷 P4924 [1007]魔法少女小Scarlets


刚开始做的时候自己也手动模拟了一遍,但是结果却错了,后来看了一下题解,学会了一个更加巧妙的解法;

题目链接:https://www.luogu.com.cn/problem/P4924

 手动模拟一遍。

题解+注释:

#include 
using namespace std;
const int N = 510;
int q[N][N], t[N][N];  // t是临时数组 

void spin(int x, int y, int r)
{
    for(int i = x - r; i <= x + r; i++)
    for(int j = y - r; j <= y + r; j++)
    t[i][j]  = q[i][j];   // 先把要转换的那个矩阵复制到t上 
    
    int xx = x + r, yy = y - r;   // 这个很巧妙 
    
    for(int i = x - r; i <= x + r; i++)
    {
        for(int j = y - r; j <= y + r; j++)
        {
            q[i][j] = t[xx][yy];   // 然后根据规律 把t每一行的数据赋给q的每一列(要对应) 
            xx--;
        }
        xx = x + r, yy++;  // 模拟 
    }
}
void spin_(int x, int y, int r)  // 同理 
{
    for(int i = x - r; i <= x + r; i++)
    for(int j = y - r; j <= y + r; j++)
    t[i][j] = q[i][j];
    int xx = x - r, yy = y + r;
    for(int i = x - r; i <= x + r; i++)
    {
        for(int j = y - r; j <= y + r; j++)
        {
            q[i][j] = t[xx][yy];
            xx++;
        }
        yy--, xx = x - r;
    }
}
int main()
{
    int n, m, k = 0;
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        q[i][j] = ++k;
    }
    while(m--)
    {
        int x, y, r, z;
        cin >> x >> y >> r >> z;
        if(z == 0)
            spin(x, y, r);
        else
            spin_(x, y, r);
    }
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        cout << q[i][j] << ' ';
        cout << endl;
    }
    return 0;
}