STLSTLSTL中还给我们提供了一个非常方便的容器—— ListListList 。对于这种偏工程向的题目,显然,用List与迭代器实现会更加简单,直观,好写。
读题 分析题目需求
首先,我们仔细地阅读一遍题目,首先,对于地图,我们发现对于地图上的一个点,我们需要储存两种信息——能否通过,与信息素数量。我们这么定义地图上的每一个点:
(如果你并不会使用List,可以去自行百度地说QwQQwQQwQ,操作很少derderder)
是可以预处理出来的,我们也用全局变量将它储存起来。
考虑简单操作
分析整个游戏过程,我们发现,对于全部的操作而言,只有移动和攻击是十分麻烦的,对于其他的操作,由于我们使用了 ListListList 容器,很容易就能维护。于是,我们先实现那些比较简单的需求。
,也可以在不使用 powpowpow 函数的情况下快速得到,于是,我们很容易就能写出生成蚂蚁的函数了。
对于每一秒结束,我们都需要减少地图上每个点的信息素,并增加当前存活的蚂蚁年龄。
考虑移动
首先,我们阅读题目,关于移动的描述非常长而复杂,在提取有用信息后,我们发现,移动无非是这么一个过程。
从向东开始顺时针遍历每一个方向,如果只有一个信息素最大的点,我们朝着信息素最大的点前进,如果有多个,我们往最先遍历到的点前进。
如果没有一个点可以前往,我们把蚂蚁上一秒的位置更新到现在的位置,这意味着到了下一秒,蚂蚁就可以原路返回了。
如果蚂蚁的年龄+1+1+1之后是5的倍数,我们需要让这只蚂蚁逆时针找到第一个可以移动的方向作为它的前进方向。
更新地图上点的状态,更新蚂蚁的位置。
由于我们使用的是ListListList容器,我们只需要用迭代器访问容器内元素的地址就可以实现更改了,代码如下。
考虑攻击
首先,我们仔细地阅读题目,发现攻击有以下几个步骤。
对于每一个防御塔的攻击目标,我们遍历每一只蚂蚁,如果有蚂蚁在其攻击范围内,我们优先选择攻击携带蛋糕的蚂蚁,其次选择距离最近的蚂蚁。
每一个防御塔开始攻击,
如果防御塔的目标是距离最近的蚂蚁,我们只需要扣除目标相应的血量,反之,我们运用向量的相关知识,判断攻击范围中的蚂蚁是否与激光有公共点,有就扣血。
在写完几何模板之后,我们很容易就能写出攻击的代码了。
完整代码
由洛谷搬运而来,请见谅!!