假设我们有一个离散单元区域(2d数组或表格)。我们内部有一些有限的路径,没有自交叉,也没有对角线连接。粒子在A点开始并沿着图案到达B点。一步可以在有限的时间内完成= t。因此整个路径的时间将是T = t * l,其中l =路径中的单元数。但!我们在该领域有一些细胞标记为' h'并且' v'。如果粒子击中'h'然后细胞分成3个颗粒。一个继续前进的道路。第二个开始向左移动' h'单元格到字段的左边界。第三个开始从' h'单元格到该字段的右边界。类似于' v'单元格,但不是左/右,另外2个粒子开始向上/向下移动。所有粒子以相同的速度同时移动。额外的颗粒可以收集' h'和' v'也可以分割并产生更多粒子。需要在Lua中编写函数,计算从第一个粒子开始的那一刻到所有粒子完成它们的方式的时刻。见相关插图。请注意,一旦' h'或者' v'细胞已被收集,它变成一个简单的细胞,如果击中其他颗粒则不会分裂。
答案 0 :(得分:0)
除了模拟的直接运行之外,没有太多的算法可以在这里完成。 由于不同粒子的运动改变了其他粒子运动的条件(如收获期间的情况),因此对模拟时间没有先验知识。
如果在互动过程后仍保留v
和h
图块,那么您只需执行简单的光线跟踪,即扫描路线,找到v
和h
图块扫描从v
和h
切片绘制的线条,找到v
,h
或边框切片,计算最长路径,从新发现的v
中绘制线条,{{1扫描那些,依此类推,直到所有行都到达边框或锁定循环。要忽略循环结果,您可以记住当前检查过的光线及其前身已经访问过哪些图块。
显然,由于特殊图块(h
,v
)只能延长模拟时间,因此上面的结果会给模拟中消失的特殊图块提供时间上限。要计算确切的运行时间,您需要考虑触发特定磁贴的时刻。当然,有可能用光线做到这一点,但需要一点思考,它等同于直接模拟粒子。
代码非常简单,我只会简要介绍算法:
h
当你解决lua中的问题时,你的机器足够强大,不用担心内存占用,只需用可变大小的阵列即可解决问题。但对于当前任务,可以将内存的粗略上限设置为:1 + 2 *(num_v + num_h)。 再次,在直接模拟中,您可能会有更少的粒子,但由于每次与特殊图块的交互都会移除特殊图块并添加一对粒子,因此您将永远不会有更多粒子。