题目链接
考察知识点: 坐标变换、递归、分治。
核心问题:计算出点的坐标。
策略是递归算出子图形中的坐标,再进行平移得到当前图形中的坐标。
采用下图方式建立坐标系:原点在中心。

前置知识:
(x,y)(x,y)(x,y) 逆时针旋转 θ\thetaθ 角度,坐标为 (xcosθ−ysinθ,xsinθ−ycosθ)(x\cos\theta-y\sin\theta,x\sin\theta-y\cos\theta)(xcosθ−ysinθ,xsinθ−ycosθ) 。
设 nnn 为等级,mmm 为在等级为 nnn 时的编号。
单位长度=2n单位长度=2^{n}单位长度=2n 。
len=单位长度2=2n−1len = \frac{单位长度}{2} = 2^{n-1}len=2单位长度=2n−1 。
m=4n=22nm=4^{n}=2^{2n}m=4n=22n 。
等级 222 的 000 号图形是由等级 111 的图形顺时针旋转 90°90°90° ,再进行 yyy 轴轴对称得到。
假设在等级 111 中的坐标为 (x,y)(x,y)(x,y) ,旋转后为 (y,−x)(y,-x)(y,−x) ,再进行关于 yyy 轴的轴对称得到 (−y,−x)(-y,-x)(−y,−x) 。
同理可以得到如下表格:
| 原始坐标 | 图形0中坐标 | 图形1中坐标 | 图形2中坐标 | 图形3中坐标 |
|---|
| (x,y)(x,y)(x,y) | (−y,−x)(-y,-x)(−y,−x) | (x,y)(x,y)(x,y) | (x,y)(x,y)(x,y) | (y,x)(y,x)(y,x) |
因为等级 111 的原点和等级 222 的原点不重合,所以需要将原点进行平移。
原点平移后得到最终坐标如下:
| 原始坐标 | 图形0 | 图形1 | 图形2 | 图形3 |
|---|
| $(x,y) $ | (−y−len,−x+len)(-y-len,-x+len)(−y−len,−x+len) | (x+len,y+len)(x+len,y+len)(x+len,y+len) | (x+len,y−len)(x+len,y-len)(x+len,y−len) | (y−len,x−len)(y-len,x-len)(y−len,x−len) |
我们的编号从 000 开始,计算坐标注意减一。
时间复杂度: O(n)O(n)O(n)
代码
// #pragma GCC optimize(3)
#include
#include