1 条题解
-
0
J. 变形虫阿曼达 详细题解
题目核心理解
变形虫在方格网格中移动,每一步必须先移除一个叶子像素(保持连通),再在另一个空闲位置添加一个像素,全程身体保持连通。 给定初始形态和目标形态(大小相同、均连通、障碍固定),要求输出合法移动序列,或判断无解。
核心思路
1. 关键性质
- 存在解的充要条件:存在一条连接初始区域与目标区域的路径,中间只经过空地。
- 变形虫的移动等价于:把初始形状“拆成树”,再沿着路径搬到目标形状“拼成树”。
- 删点只能删叶子,加点只能连到当前身体,保证全程连通。
2. 构造规则
- 找点 (初始身体)、点 (目标身体),以及路径 (全为空地)。
- 用 BFS/DFS 构造初始树 、目标树 。
- 自底向上删除 叶子,依次填充路径 。
- 自顶向下加入 ,先加根 ,再依次加子节点。
- 最后移除路径点并补到 底部,得到目标形状。
3. 冲突处理
- 若某点同时在 和 :先正常删除,后面再加回来。
- 若某点还在身体里就需要加入:跳过不删,直接保留,保证连通。
算法流程
- 读取网格、初始形态、目标形态与障碍。
- 检查初始与目标之间是否存在可达空地路径,不存在则输出
NO。 - 对初始形态做 BFS/DFS 生成树 ,对目标形态生成树 。
- 后序遍历 删叶子,将删除的点依次移动到 与 。
- 输出所有移动操作,步数不超过 ,满足题目限制。
公式与复杂度分析
可达性判定:
$$\text{reachable}(S, T) \iff \text{存在路径 } S \to Q_{AB} \to T $$单步操作:
$$\text{remove}(leaf) \implies \text{add}(neighbour\ of\ body) $$复杂度
- 路径查找:
- 树构造:
- 移动构造:
- 总时间复杂度:
可轻松处理 ,总像素 ,步数远小于 限制。
- 1
信息
- ID
- 6592
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者