ABC375 C题题解
个人认为比 D 题难。
题目名叫螺旋旋转,所以思考旋转。
观察样例解释可发现,每次操作是将中心的正方形顺时针旋转 度,每次旋转的正方形大小都会缩小 圈,对于每一圈(距中心曼哈顿距离相同的格子),都会旋转相同次。
又易得转 次与不转没有区别,所以从外到内每圈的转圈数为 。
Code:
#include<bits/stdc++.h>
using namespace std;
int n;
char c[3005][3005], t[3005][3005];
void change(int st, int ed){//转一圈
for(int i = st; i < ed; i ++) t[i][ed] = c[st][i];
for(int i = st + 1; i <= ed; i ++) t[i][st] = c[ed][i];
for(int i = st + 1; i <= ed; i ++) t[st][n - i + 1] = c[i][st];
for(int i = st; i < ed; i ++) t[ed][n - i + 1] = c[i][ed];
for(int i = st; i < ed; i ++) c[i][ed] = t[i][ed];
for(int i = st + 1; i <= ed; i ++) c[i][st] = t[i][st];
for(int i = st + 1; i <= ed; i ++) c[st][n - i + 1] = t[st][n - i + 1];
for(int i = st; i < ed; i ++) c[ed][n - i + 1] = t[ed][n - i + 1];
}
int main(){
cin >> n;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
cin >> c[i][j];
for(int i = 1; i <= n / 2; i ++){//每次操作
for(int j = 1; j <= i % 4; j ++) change(i, n - i + 1);
}
for(int i = 1; i <= n; i ++){
for(int j = 1; j <= n; j ++)
cout << c[i][j];
cout << "\n";
}
return 0;
}
转圈的大致思路为如下:
a b c
h . d
g f e
ab
,cd
,ef
,gh
,是四条边上的点,分别在中间数组上旋转即可。
posted on 2024-10-12 21:57 zhangzirui66 阅读(4) 评论(0) 编辑 收藏 举报 来源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】