1 条题解
-
0
关键观察
连续移动机制:在激活格上可以连续移动,这相当于从某个停止格出发,经过一串激活格,最终停在另一个停止格。我们可以将这样的连续移动路径压缩为一条"大边"。
回合制的影响:玩家按顺序 轮流行动。如果玩家1需要移动 次,那么总步数至少为 。
其他玩家的作用:其他玩家可能需要移动来"让路",为玩家1创造到达目标的条件。
解法思路
步骤1:构建压缩图 我们构建一个新图,其中节点是所有停止格加上玩家1的起点 (如果 不是停止格)。
对于每个节点 ,我们进行BFS:
如果 是停止格,则从 出发,只走激活格,记录能到达的所有停止格 及步数
如果 是激活格,则从 出发,找到最近的停止格
这样我们得到一个新图 ,边权表示从一个停止格到另一个停止格所需的最小步数。
步骤2:计算玩家1的最少移动次数 在新图 上,我们从玩家1的起点 开始BFS,计算到达每个停止格 所需的最少玩家1移动次数 。
这里需要注意:如果起点 是激活格,我们需要先找到离它最近的停止格作为实际起点。
步骤3:计算总步数 对于目标 :
如果 是停止格,玩家1移动次数
如果 是激活格,找到离 最近的停止格 ,玩家1移动次数
总步数公式:
其中 是调整项,处理其他玩家初始位置可能阻塞路径的情况。
步骤4:处理路径阻塞 如果玩家1的路径被其他玩家的初始位置阻塞,我们需要额外步数来让路。具体来说:
对于路径上的每个关键点,如果被其他玩家占用,可能需要额外1步让该玩家移动
可以通过预处理每个格子的"最早可用时间"来处理
复杂度分析
构建最近停止格:BFS,
构建压缩图:对每个停止格进行BFS,最坏 ,但实际中由于图的稀疏性和停止格数量有限,可以接受
计算最短路径:在压缩图上跑Dijkstra,,其中 是压缩图的边数
- 1
信息
- ID
- 4770
- 时间
- 1000~3000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者