数据结构课程设计
蚂蚁和瓢虫【问题描述】
蚂蚁和蚜虫是共生的。蚜虫分泌出蜜汁给蚂蚁食用,蚂蚁帮助蚜虫赶走天敌瓢虫。在蚂蚁山附近有一棵树,这里是蚜虫生活的地方。有n只蚂蚁兵,用1到n编号。一只瓢虫威胁着这个小小的生态系统,它经常出现在蚜虫活动的地方。当瓢虫落到树上时,蚂蚁兵会出动把它赶走。它们按照如下规则移动:
1)树上任意两点之间都只有一条路径,所有的蚂蚁都能同时发现瓢虫的降临,因此都会沿着它所在点到瓢虫的路径前进。每移动一个位置,花费1个时间单位。
2)若瓢虫降落的地点恰好有一只蚂蚁,则该蚂蚁立刻赶走瓢虫,并记录其赶走瓢虫次数加1。
3)如果某只蚂蚁的路径上有另外一只蚂蚁,那么距离目标较远的蚂蚁待在原地不动,较近的那只蚂蚁继续前进。
4)如有多只蚂蚁要进入同一个结点,那么选择编号最小的蚂蚁,其余的蚂蚁留在原位置不动。
5)当蚂蚁到达了瓢虫的位置后,把它赶走,然后停留在该位置,并记录其赶走瓢虫次数加1。
若整个系统仅有一只瓢虫,且设树的总结点数m≥2n,试模拟一下此生态系统的运行。
【基本要求】
1.用清晰明确的语言表述树的存储方法。
2.将事件按照事件单位分段模拟。注意:同一个结点任一时刻只能有一只生物,或蚂蚁、或瓢虫。
3.瓢虫的出现事件通过随机函数实现。
4.用清晰明确的语言表述算法的实现原理或机制。
5.将规则3的条件放宽为,当瓢虫降落后,所有蚂蚁都先观察自己前进的路途前方有无别的蚂蚁,如果有则自己原地不动,只有当自己前方没有别的蚂蚁时才会向瓢虫所在结点移动。
6.将输出结果保存到文本文件中。
【输入输出】
输入:1)蚂蚁兵的数量ants;2)树的结点数nodes。
输出:初始状态,时间为0,生成树形结构并显示树结构。
按照时间段从1开始,显示瓢虫出现的结点编号,以及发生移动的蚂蚁编号及其移动路径,直到瓢虫被赶走。例如:
时间点1:瓢虫出现在结点35。
时间点2:蚂蚁9从结点15移向结点18,蚂蚁13从结点34移向结点2,蚂蚁17从结点16移向结点2,因有编号更小的蚂蚁同时移向结点2,故蚂蚁17原位不动。
……
时间点i:蚂蚁9从结点34移向结点35,瓢虫被赶走。蚂蚁9记功一次。
时间点i+1:瓢虫出现在结点27。
……
时间点n:运行结束(确保结束时没有瓢虫在树上)。
统计结果:总共出现瓢虫x次,蚂蚁9赶走5只瓢虫,蚂蚁16赶走3只瓢虫,……
【实现提示】
由于这是一棵任意树,因此树的存储方法至关重要。我们可以确定的是这棵树没有回路,因此将瓢虫出现的结点作为根是个不错的主意。可以考虑通过左孩子右兄弟法来转换此树。可以借用图的广度优先遍历思路来解决此问题。