1 条题解
-
0
G. Geometric Balance 详细题解
题意梳理
乌龟在平面上行动,支持三种指令:
rotate a:逆时针旋转度,保证是的倍数,仅朝向8个方位;draw d:朝当前方向画长度为的线段,记录墨水覆盖路径;move d:朝当前方向移动,不留下痕迹。
求最小正整数角度,满足:将乌龟任意平移位置、整体旋转后,原样执行所有指令,画出的墨水点集与原图完全一致。
核心结论
- 合法旋转角只能是的倍数:;
- 一定是合法解,题目保证答案存在;
- 只需提取所有
draw生成的线段端点,图案旋转后整体平移能与原图案完全重合,则合法; - 从小到大枚举角度,第一个合法角度即为答案。
方向建模
将8个45°朝向编号,对应单位方向向量:
$$\begin{align*} 0&: (1,0)\quad(0^\circ)\\ 1&: (1,1)\quad(45^\circ)\\ 2&: (0,1)\quad(90^\circ)\\ 3&: (-1,1)\quad(135^\circ)\\ 4&: (-1,0)\quad(180^\circ)\\ 5&: (-1,-1)\quad(225^\circ)\\ 6&: (0,-1)\quad(270^\circ)\\ 7&: (1,-1)\quad(315^\circ) \end{align*} $$每次旋转度,等价于朝向编号增加,对取模更新朝向。
模拟过程
- 初始位置,初始朝向编号;
- 遍历所有指令:
- 旋转指令:更新朝向;
- 移动/绘制指令:根据当前朝向算出终点坐标;
- 仅
draw指令存入线段起点、终点,move不记录图案信息;
- 最终得到原图所有墨水端点集合。
旋转重合判定原理
设候选旋转角度为,对应弧度。 平面点逆时针旋转后的坐标公式:
$$\begin{cases} x' = x\cos\theta - y\sin\theta\\ y' = x\sin\theta + y\cos\theta \end{cases} $$判定规则:
- 取集合内第一个点,旋转得到;
- 求出唯一固定平移量:
- 对集合内所有点,旋转后加上平移量,若都能与原点点重合,则角度合法。
枚举策略
按从小到大依次验证,第一个满足条件的角度就是最小答案。
复杂度分析
- 指令总数,模拟遍历;
draw指令最多条,总端点数量;- 最多枚举种角度,总复杂度,时间完全满足限制。
样例解析
样例1
输入仅一条
draw 10,只有一条线段。- 旋转后平移可与原线段重合,更小角度不满足,输出。
样例2
连续四次转绘制,构成正方形。
- 旋转即可整体重合,输出。
样例3
两段长度不同、位置错开的线段,无小于的对称角度,输出。
代码核心细节
- 用
double存储坐标,设置精度误差进行浮点数判等; sgn函数统一处理浮点正负与相等判断,避免精度出错;- 仅保存绘制端点,舍弃无效移动路径,精简判定集合;
- 枚举顺序严格从小到大,保证最先找到最小合法角度。
易错点
- 不能只判定线段重合,必须判定所有端点整体旋转平移重合;
- 旋转为逆时针,公式不可写反;
- 朝向更新必须对取模,防止朝向编号越界;
- 不可忽略平移量,仅原点旋转无法满足题目题意。
- 1
信息
- ID
- 7090
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者