题解 [ABC375C] Spiral Rotation
cjh20090318 · · 题解
近 40 场以来最难的 C,有点难写。
题意
有一个 # 和白色 . 组成。
按照顺序
- 对于
i 和N + 1 - i 之间的所有整数对x, y ,用单元格(x, y) 的颜色替换单元格(y, N + 1 - x) 的颜色。同时对所有这些单元格对x, y 进行替换。
最后找出每个单元格的颜色。
分析
这个操作感觉没有说人话,经过一定的模拟发现,每一次操作即把一个左上顶点为
直接暴力的对于每个
设第
因为外层的影响,第
时间复杂度
代码
//the code is from chenjh
#include<cstdio>
using namespace std;
int n;
char s[3005][3005],b[3005][3005];
void r(const int i){
//对第 i 层进行右旋。
for(int j=i;j<=n-i;j++) b[j][n-i+1]=s[i][j];
for(int j=i;j<=n-i;j++) b[n-i+1][n-j+1]=s[j][n-i+1];
for(int j=n-i+1;j>i;j--) b[j][i]=s[n-i+1][j];
for(int j=n-i+1;j>i;j--) b[i][n-j+1]=s[j][i];
//将临时存储的数组复制回原数组。
for(int j=i;j<=n-i;j++) s[i][j]=b[i][j];
for(int j=i;j<=n-i;j++) s[j][n-i+1]=b[j][n-i+1];
for(int j=n-i+1;j>i;j--) s[n-i+1][j]=b[n-i+1][j];
for(int j=n-i+1;j>i;j--) s[j][i]=b[j][i];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
for(int i=1;i<=(n>>1);i++)for(int _=i&3;_--;)r(i);//i&3 和 i%4 等价。
for(int i=1;i<=n;i++) puts(s[i]+1);
return 0;
}