寻找最近动物的算法

时间:2014-05-03 08:59:54

标签: java arrays algorithm 2d

所以我正在写一只兔子和狼的模拟 - 开始时有一定数量的狼和兔子,兔子逃离狼和狼追逐兔子,当他们在同一个街区相遇时兔子被杀死并模拟当没有兔子离开时结束。我写了大部分代码,但是我不知道怎么做才能让兔子逃离狼群,狼群追逐兔子。我必须首先编写一个算法,找到最近的动物,然后计算最佳动作(这是一个简单的部分)。

动物可以在一个线程循环中向上,向下和交叉移动,如果有2只狼离开2次移动,那么我必须将我逃跑的那只狼随机化(狼群和追逐兔子一样)

我的第一种方法是,我以某种方式(可能递归?)从我给定的动物开始搜索数组,然后围绕它进行搜索:

所以第一次迭代它没有发现狼,第二次发现2,所以它保存了它们的坐标,结束它的工作并将它传递给随机选择的函数。现在,我认为这将是最好的主意,但我不知道如何实现它:(我试了几个小时,但我放弃了因为我没有到达任何地方。

第二种方法,非常天真,就是在棋盘上找到所有的狼,然后为每个计算到达兔子所需的移动量,然后保存最少量的那些。我可以编码,但我认为这对于更大的电路板来说真的是无用的。

3 个答案:

答案 0 :(得分:2)

这是Closest pair of points problem

以下是一项实施:http://algs4.cs.princeton.edu/99hull/ClosestPair.java.html

您的对象只能垂直或水平移动,因此您需要用x + y替换距离。

答案 1 :(得分:2)

兔子应该看看所有狼的寿命。如果他只是逃离最近的一个 - 这可能是一个很大的错误。

在这种情况下,如果狼喜欢“UP”而不是“RIGHT”,或“RIGHT”而不是“DOWN”(顺时针优先),他会活得很长。此外,如果只有几只非随机狼,兔子可能会变成不朽的)

我可以建议的最简单的逻辑是检查船上的所有狼并选择最接近的5,按曼哈顿ditances(dx + dy)排序,并让它为D1,D2,D3,D4,D5。

所以,让“D--进入某个牢房是多么危险”。计算

  

D = D1 * A + D2 * B + D3 * C + D4 * D + D5 * E

     

A> B> C> D> ë

对于与当前兔细胞相邻的所有4个细胞。并选择具有最小值的单元格(您需要通过实验找到A,B,C,D,E)。我想你也可以为D1,D2,D3,D4,D5做一些上限。例如,D4或D5的狼真的很远 - 他不应该受到任何影响,所以只需要D4 = D5 = 0.

当然,在这种情况下,这种逻辑会失败

enter image description here

但我认为我们根本无法做到这一点,所以我们并不是在尝试优化

答案 2 :(得分:1)

如果电路板上的物体数量远少于电路板本身(例如,电路板可以达到1000x1000,但最多只有10,000只狼),实际的方法是分别存储每个物体的坐标。然后,您可以检查狼的列表,而不必每次都在板上找到它们。

为了保持两种表示,需要在两个方向上引用:每个板单元都有一个指向其中包含的对象的指针(指针列表,如果可以有几个),并且每个对象包含其坐标细胞。还有一个单独的列表(或数组)包含(指向)所有现有对象,或者可能是两个单独的狼和兔子列表,具体取决于您需要经常迭代的内容。