1 条题解

  • 0
    @ 2025-10-23 10:04:25

    题目大意

    模拟一个“蚂蚁 vs 防御塔”的游戏,需要严格按照题目描述的时序规则,模拟从第 11 秒到第 tt 秒内发生的所有事件,包括蚂蚁出生、移动、信息素留下与衰减、扛蛋糕、防御塔攻击、游戏结束判断等。


    问题分析

    1. 核心难点

    此题没有复杂的算法,但模拟过程极其繁琐,需要严格按时间顺序处理多个阶段的事件,且每个阶段都有复杂的判定规则:

    • 蚂蚁移动方向选择(考虑信息素、可达性、特殊转向规则)
    • 激光塔攻击判定(几何判断线段与圆相交)
    • 多只蚂蚁的出生、死亡、状态更新时序
    • 蛋糕的扛起、掉落、归位机制

    模拟流程(每秒按顺序执行)

    阶段 1:蚂蚁出生

    • 如果场上蚂蚁数 <6< 6 且洞口 (0,0)(0,0) 没有蚂蚁,则在洞口生成一只新蚂蚁
    • 蚂蚁级别:第 11-66 只为 11 级,第 77-1212 只为 22 级,以此类推
    • 初始血量 = 4×1.1level\lfloor 4 \times 1.1^{level} \rfloor

    阶段 2:蚂蚁移动(按出生顺序处理)

    对每只蚂蚁:

    1. 留下信息素:如果扛蛋糕则留 55 单位,否则留 22 单位
    2. 确定移动方向
      • 检查北、南、东、西四个方向的可达性(无蚂蚁/无塔/非上一位置/不越界)
      • 在可达方向中选择信息素最多的
      • 如果信息素相同,按东→南→西→北的顺时针顺序选择
      • 特殊规则:如果蚂蚁年龄是 55 的倍数,先按上述规则确定方向,然后逆时针转 90°90° 作为初始方向,如果不可达则继续逆时针旋转直到找到可达方向
    3. 移动:如果找到可达方向则移动,否则停留原地

    阶段 3:蛋糕处理

    • 如果有蚂蚁在蛋糕位置 (n,m)(n,m) 且蛋糕未被扛走,则该蚂蚁扛起蛋糕
    • 扛蛋糕时血量增加 出生血量/2\lfloor \text{出生血量} / 2 \rfloor(不超过上限)
    • 扛蛋糕的蚂蚁立即成为所有塔的优先攻击目标

    阶段 4:防御塔攻击(所有塔同时攻击)

    对每个塔:

    1. 选择目标
      • 如果有扛蛋糕的蚂蚁在射程内,选择它
      • 否则选择离塔最近的蚂蚁(距离相同选年龄大的)
    2. 激光攻击
      • 从塔向目标蚂蚁圆心连线
      • 检查这条线段与所有蚂蚁的圆是否有交点
      • 从塔出发,按距离从小到大处理蚂蚁,对每个与线段相交的蚂蚁造成 dd 点伤害
      • 激光不穿透目标:打到目标蚂蚁后停止

    阶段 5:游戏结束判断

    • 如果扛蛋糕的蚂蚁在蚂蚁窝 (0,0)(0,0),游戏立即结束
    • 如果扛蛋糕的蚂蚁死亡,蛋糕归位到 (n,m)(n,m)

    阶段 6:环境更新

    • 地图上所有点的信息素减少 11(不低于 00
    • 所有存活蚂蚁年龄 +1+1
    • 检查并移除血量为负数的死亡蚂蚁

    数据结构设计

    • 地图信息n×mn \times m 的网格,记录每个格子的信息素量、是否有塔
    • 蚂蚁列表:按出生顺序存储,记录每只蚂蚁的位置、血量、等级、年龄、是否扛蛋糕、上一秒位置等
    • 塔列表:记录每个塔的位置

    几何计算

    激光攻击需要判断线段与圆是否相交

    • 设塔位置 TT,目标蚂蚁圆心 PP,检查蚂蚁 AA 的圆心 CC
    • 计算点 CC 到线段 TPTP 的最短距离
    • 如果距离 0.5\leq 0.5(蚂蚁半径)则命中

    复杂度分析

    • 每秒钟处理:$O(\text{蚂蚁数} \times \text{方向选择} + \text{塔数} \times \text{蚂蚁数} \times \text{几何判断})$
    • 最坏情况:t=2×105t = 2\times 10^5 秒,但 n,m8n,m \leq 8,蚂蚁数 6\leq 6,塔数 20\leq 20,完全可接受

    关键注意事项

    1. 严格按时序:每个阶段必须按顺序执行,阶段内也要按规则顺序
    2. 移动优先级:先出生的蚂蚁先移动
    3. 特殊转向规则:年龄为 55 的倍数时的逆时针转向
    4. 激光不穿透:打到目标就停止,后面的蚂蚁不受伤害
    5. 蛋糕状态:只有扛蛋糕的蚂蚁死亡时才归位
    6. 游戏结束时机:扛蛋糕蚂蚁到达 (0,0)(0,0) 立即结束,不执行后续阶段

    总结

    这道题考察的是细心实现复杂规则的能力代码调试功力,需要将冗长的题目描述转化为精确的代码逻辑,是典型的"工程型"模拟题。

    • 1

    信息

    ID
    3858
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者