# 恐怖机器人:题解 ## 解法比较 出题人解法先按四连通标记障碍组,再在状态 $(x,y,a,c)$ 上做 BFS,其中 $a$ 是上一步移动的轴,$c$ 是拆除的障碍组(也包括不拆除)。每次只能换轴移动,且只有所选组变为可通行。另用允许的连通性检查区分题目规定的两类不可达情况。固定 $c$ 后,状态转移与下文的 BFS 完全相同;单位边长保证第一次到达就是最短路。 出题人实现同时保存所有 $c$ 的距离。若格子数为 $V$ 、障碍组数为 $C$ ,时间、空间上界均为 $O((C+1)V)$ .Codex(GPT-6)采用的实现逐个枚举拆除组,每次复用位置与方向数组,时间上界不变,工作空间降为 $O(V)$ .这是减少同时驻留状态的改进,拆除组枚举和交替方向 BFS 均沿用出题人解法。 ## 将追逐写成路径 固定轰炸选择。设要塞的路线为 $v_0,v_1,\ldots,v_t$ ,其中 $v_0$ 是起点、$v_t$ 是第一个到达的陷阱。机器人先放在 $v_1$ .在要塞走到 $v_i$ 前,机器人从 $v_i$ 移向 $v_{i+1}$ ;最后停在 $v_t$ 等待要塞进入。 只使用一个机器人,当且仅当每一对相邻移动 $v_{i-1}\to v_i$ 与 $v_i\to v_{i+1}$ 不在同一直线上。八个方向因此可以合并为四类无向轴:竖直、水平、主对角线、副对角线。相邻两步的轴必须不同。最后一步之后无需再转向,因为捕获已经结束。 ## 从全部陷阱反向搜索 状态 $(u,a)$ 表示位于格子 $u$ ,已经走过的一步属于轴 $a$ .从陷阱逆向走回起点时,同样要求相邻两步轴不同。 把每个陷阱的四个状态都以距离 $0$ 入队。这样第一步可以选择任意轴。处理状态 $(u,a)$ 时,枚举可通行相邻格 $v$ ,若连线轴为 $b\ne a$ ,则转移至 $(v,b)$ ,距离加一。用多源 BFS 求最短路;一个起点的四种状态距离的最小值,就是此轰炸选择下一个机器人所需的最少移动次数。 从陷阱初始化全部轴并不要求真的执行一步。它只编码“第一步没有方向限制”。任何从陷阱开始的非空路径都能选一个与首步不同的初始轴。 ## 多个机器人和不可达 允许不断补充机器人时,每条可通行的八连通路径都能实现:每次把一个机器人放在下一格,再让它停留即可。反过来,要塞的每次移动必然沿一条这样的边。 因此再从所有陷阱做普通八连通搜索。若方向状态搜索没有答案,而普通搜索可以到达,则这一轰炸选择需要多个机器人。 先用四连通搜索标记全部障碍连通块。分别枚举不轰炸及炸除每一块,重新进行上述两种搜索。所有选择中只要存在一个机器人的方案,就取其最小距离;否则若至少一种选择普通可达,输出 `-2` ,否则输出 `-1` . ## 正确性 追逐规则逐步等价于相邻路径边轴不同,且最后允许牺牲机器人,因此方向状态路径与单机器人方案互相对应,长度保持不变。BFS 给出固定轰炸选择的最短长度。普通连通性与允许补充机器人的可行性互相等价。最后枚举了全部允许的轰炸选择,按题目要求优先选择单机器人方案,所以结果正确。 ## 复杂度与实现 令 $V=nm$ ,障碍连通块数为 $c$ .每次搜索的格子状态数为 $O(V)$ ,每个状态最多检查八个邻居,总时间 $O((c+1)V)$ ,额外空间 $O(V)$ .实现逐次复用搜索数组,不为所有轰炸选择同时存储状态。 对角移动只检查目的格。障碍连通块使用四连通;搜索使用八连通,二者不可混淆。没有陷阱时两个搜索的初始队列都为空,所有起点自然输出 `-1` .