算法 - 找到最近的空方格2d网格

时间:2013-07-18 21:52:24

标签: algorithm

给定2d网格上的起始方块(y,x),我想找到最接近它的空方块。 (注意:与起始正方形相邻的4个方格应该比最接近它的4个对角方格更接近。)

下图显示了检查此网格上的以下单元格所需的顺序:

image

网格是有界的,但可能非常大。实际上,起始坐标将随机位于网格周围。 (所以,我不认为担心网格范围之外的坐标太重要了。)

我可以使用什么算法以这种方式围绕圆圈进行迭代?

3 个答案:

答案 0 :(得分:2)

简单的广度优先搜索会做到这一点。将要检查的每个邻居推到堆上,按距离划分优先级。您可以使用曼哈顿距离(dx + dy),但如果不是仅使用平方径向距离(dx 2 + dy 2 )。每当你弹出一个项目时它就会是最近的。如果它是空的,你就找到了它。否则将其邻居推入堆并继续弹出。

我可能会使用方形径向距离并且只添加相邻的正方形(不是对角线)。稍后将考虑对角线,因为它们紧邻其他正方形。您需要一种方法来跟踪已经考虑过的方块,这样您就不会再次添加它们。必须有一种聪明的动态编程方式来跟踪这一点,而不必在每次搜索时都清除大量的布尔值...但是说,一大块布尔值会很好地完成。

答案 1 :(得分:2)

可以使用BFS(广度优先搜索)来解决。我们必须处理每个方块两次。我们第一次访问仍然没有访问过的方块,它们与当前方块共享边缘,下次我们访问那些与当前方块(对角线相邻的方块)至少共享一个点的方块

我们可以使用两个不同的队列来确保在第二次处理正方形之前,从源到当前正方形的距离相等的所有正方形都至少被处理过一次。 : - )

平均运行时间:O(V * 8)。其中V是网格内的平方数

答案 2 :(得分:1)

如果网格内容经常更改,请使用先前答案中描述的方法,即先行搜索。

如果您的网格内容确实很少更改并且曼哈顿距离适合您的应用程序,我的建议是计算二值化网格的distance transform(如果为空则为0,其他为1)距离变换非常简单曼哈顿距离,对于欧几里德距离来说更复杂)。该步骤可以以2 * N * M(网格的元素数量)的代价来完成。然后,对于每个请求,您可以以非常直接的方式访问邻域,即从起始单元格开始的最小距离路径(如某些梯度下降),它将停在最近的空单元格。使用这种算法搜索可能会更快,因为对于距离超过1个单元格的空单元格而言,您的查找方式并不正确。