[BZOJ1033]杀蚂蚁Antbuster - 最全面坑点剖析

本文主要剖析了BZOJ1033题目的模拟过程,重点总结了题目中的关键坑点,包括:题面理解、蚂蚁年龄处理、选择方向的逻辑、蚂蚁状态维护、精度问题处理等。建议在遇到WA时重新阅读题面,并使用整数计算避免精度误差。
摘要由CSDN通过智能技术生成

啊,大模拟~

我知道你们最想看的是坑点总结

搜集了几位神犇总结的坑点1,加上我自己发现的一些:

  1. 大视野上题面无排版,建议看CodeVS上的题面。同时大视野上的样例解释有误(那个样例解释对应的是codeVS上的样例)。
  2. 输出中的“年龄”比描述中少1。
    要么在输出时减1;要么改为刚出生的蚂蚁年龄是0,行动方式变化的蚂蚁(年龄+1)%5==0而不是年龄%5==0。
  3. “不能是蚂蚁上一秒所在的点”指的是上一秒来时的方向。
  4. 选择方向的过程是:首先根据规则1-3选出一个最优方向,这个时候判断如果秒数不是5的倍数的话就直接走过去;如果是5的倍数就按照下一个规则逆时针转,直到“可达”,然后走过去。
    注意可达点的定义以及各种前提(先可达、再信息素最大) 。题面中,可选择的方向 == 可以去的方向 != 可达的点。前两者要求信息素最大,而后者不要求。
  5. 杀死一只蚂蚁之后,需要更新:撤销占用地图,当前蚂蚁数量,蛋糕
  6. 蚂蚁用链表维护最好,这样自动按出生顺序排序。但我懒得写链表,就用的vector+erase(),也很方便。直接用构造函数和析构函数实现蚂蚁的出生和死亡,在vector中存指针,可以保证不出现重复的对象或意外产生复制构造或析构的情况。
  7. 实现“炮塔同时瞄准和开火”,只要瞄准和计算伤害时并不考虑蚂蚁是否已死,在所有laser攻击完之后,再统一erase掉死蚂蚁就好。
  8. 蚂蚁直径为 1 ,半径为 0.5
  9. 计算蚂蚁是否被激光打中时容易被卡精度。这里又一种用int而避免使用double的做法:
    设laser在 P 点,target在 Q 点,ant在 A 点,判断 A 是否被线段 PQ 打中。首先算 A PQ 的距离,这可以通过 PA PQ 法向量方向上的投影计算。直接将
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值