ABC375 C题题解

个人认为比 D 题难。

题目名叫螺旋旋转,所以思考旋转。

观察样例解释可发现,每次操作是将中心的正方形顺时针旋转 9090 度,每次旋转的正方形大小都会缩小 11 圈,对于每一圈(距中心曼哈顿距离相同的格子),都会旋转相同次。

又易得转 44 次与不转没有区别,所以从外到内每圈的转圈数为 (上一次转的圈数+1)mod4(上一次转的圈数+1)\bmod4

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

abcdefgh,是四条边上的点,分别在中间数组上旋转即可。

posted on   zhangzirui66  阅读(4)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示