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