算法刷题记录:P4924 [1007]魔法少女小Scarlet
题目链接
https://www.luogu.com.cn/problem/P4924
视频链接
https://www.bilibili.com/video/BV1sL411N7cb?vd_source=0bfa84bd4dad23218c3bbb5095b6c764
题目分析
这道题不是我自己写出来的,这个思路很受用!
题意为将以[x,y]为中心某个矩阵,逆时针/顺时针旋转。
所以其本质就是矩阵的旋转,所以找出通项公式即可。
通项公式:
顺时针:x后=x+y-y原,y后=y-x+x原
逆时针:x后=x-y+y原,y后=x+y-x原
AC代码
// Problem: P4924 [1007]魔法少女小Scarlet // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P4924 // Memory Limit: 125 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.org) #include <iostream> const int MAXN = 505; int n, m, x, y, r, z, cnt; int w[MAXN][MAXN]; void generate(int x, int y, int r, int z) { int b[MAXN][MAXN]; for (int i = x - r; i <= x + r; ++ i) for (int j = y - r; j <= y + r; ++ j) if (!z) b[i][j] = w[x + y - j][y - x + i]; else b[i][j] = w[x - y + j][x + y - i]; for (int i = x - r; i <= x + r; ++ i) for (int j = y - r; j <= y + r; ++ j) w[i][j] = b[i][j]; } int main() { std::cin>> n >> m; for (int i = 1; i <= n; ++ i) for (int j = 1; j <= n; ++ j) w[i][j] = ++ cnt; for (int i = 0; i < m; ++ i){ std::cin >> x >> y >> r >> z; generate(x, y, r, z); } for (int i = 1; i <= n; ++ i){ for (int j = 1; j <= n; ++ j) std::cout << w[i][j] << ' '; std::cout << std::endl; } }
本文来自博客园,作者:想个昵称好难ABCD,转载请注明原文链接:https://www.cnblogs.com/ClockParadox43/p/17471551.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】