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 阅读(11) 评论(0) 收藏 举报 来源