1 条题解
-
0
题目大意
模拟一个“蚂蚁 vs 防御塔”的游戏,需要严格按照题目描述的时序规则,模拟从第 秒到第 秒内发生的所有事件,包括蚂蚁出生、移动、信息素留下与衰减、扛蛋糕、防御塔攻击、游戏结束判断等。
问题分析
1. 核心难点
此题没有复杂的算法,但模拟过程极其繁琐,需要严格按时间顺序处理多个阶段的事件,且每个阶段都有复杂的判定规则:
- 蚂蚁移动方向选择(考虑信息素、可达性、特殊转向规则)
- 激光塔攻击判定(几何判断线段与圆相交)
- 多只蚂蚁的出生、死亡、状态更新时序
- 蛋糕的扛起、掉落、归位机制
模拟流程(每秒按顺序执行)
阶段 1:蚂蚁出生
- 如果场上蚂蚁数 且洞口 没有蚂蚁,则在洞口生成一只新蚂蚁
- 蚂蚁级别:第 - 只为 级,第 - 只为 级,以此类推
- 初始血量 =
阶段 2:蚂蚁移动(按出生顺序处理)
对每只蚂蚁:
- 留下信息素:如果扛蛋糕则留 单位,否则留 单位
- 确定移动方向:
- 检查北、南、东、西四个方向的可达性(无蚂蚁/无塔/非上一位置/不越界)
- 在可达方向中选择信息素最多的
- 如果信息素相同,按东→南→西→北的顺时针顺序选择
- 特殊规则:如果蚂蚁年龄是 的倍数,先按上述规则确定方向,然后逆时针转 作为初始方向,如果不可达则继续逆时针旋转直到找到可达方向
- 移动:如果找到可达方向则移动,否则停留原地
阶段 3:蛋糕处理
- 如果有蚂蚁在蛋糕位置 且蛋糕未被扛走,则该蚂蚁扛起蛋糕
- 扛蛋糕时血量增加 (不超过上限)
- 扛蛋糕的蚂蚁立即成为所有塔的优先攻击目标
阶段 4:防御塔攻击(所有塔同时攻击)
对每个塔:
- 选择目标:
- 如果有扛蛋糕的蚂蚁在射程内,选择它
- 否则选择离塔最近的蚂蚁(距离相同选年龄大的)
- 激光攻击:
- 从塔向目标蚂蚁圆心连线
- 检查这条线段与所有蚂蚁的圆是否有交点
- 从塔出发,按距离从小到大处理蚂蚁,对每个与线段相交的蚂蚁造成 点伤害
- 激光不穿透目标:打到目标蚂蚁后停止
阶段 5:游戏结束判断
- 如果扛蛋糕的蚂蚁在蚂蚁窝 ,游戏立即结束
- 如果扛蛋糕的蚂蚁死亡,蛋糕归位到
阶段 6:环境更新
- 地图上所有点的信息素减少 (不低于 )
- 所有存活蚂蚁年龄
- 检查并移除血量为负数的死亡蚂蚁
数据结构设计
- 地图信息: 的网格,记录每个格子的信息素量、是否有塔
- 蚂蚁列表:按出生顺序存储,记录每只蚂蚁的位置、血量、等级、年龄、是否扛蛋糕、上一秒位置等
- 塔列表:记录每个塔的位置
几何计算
激光攻击需要判断线段与圆是否相交:
- 设塔位置 ,目标蚂蚁圆心 ,检查蚂蚁 的圆心
- 计算点 到线段 的最短距离
- 如果距离 (蚂蚁半径)则命中
复杂度分析
- 每秒钟处理:$O(\text{蚂蚁数} \times \text{方向选择} + \text{塔数} \times \text{蚂蚁数} \times \text{几何判断})$
- 最坏情况: 秒,但 ,蚂蚁数 ,塔数 ,完全可接受
关键注意事项
- 严格按时序:每个阶段必须按顺序执行,阶段内也要按规则顺序
- 移动优先级:先出生的蚂蚁先移动
- 特殊转向规则:年龄为 的倍数时的逆时针转向
- 激光不穿透:打到目标就停止,后面的蚂蚁不受伤害
- 蛋糕状态:只有扛蛋糕的蚂蚁死亡时才归位
- 游戏结束时机:扛蛋糕蚂蚁到达 立即结束,不执行后续阶段
总结
这道题考察的是细心实现复杂规则的能力和代码调试功力,需要将冗长的题目描述转化为精确的代码逻辑,是典型的"工程型"模拟题。
- 1
信息
- ID
- 3858
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者