找到最短的水距离

时间:2017-01-31 17:19:47

标签: algorithm language-agnostic

我有一张土地和水的二维地图,如下所示(l代表土地,w代表水。)

lllwwwlll
lllwllllw
lllllllww
lllllllll

对于每块地砖,我想知道它距离最近的水砖的距离。水平,垂直和对角线移动均计为一个距离。

321www111
321w1111w
3211121ww
322222111

现在我正在使用这样的算法:

foreach tile in map
  if isWater(tile)
    tile.distanceFromWater = 0
  else
    radius = 1
    while !hasWaterAround(tile, radius)
      radius++
    tile.distanceFromWater = radius

这种方法有效,但速度相当慢,特别是在水砖很少的情况下。

是否有更快的算法来查找每块地砖与水的距离?

2 个答案:

答案 0 :(得分:2)

我们可以做类似以下的事情(类似于BFS,但可能从多个来源开始):

队列(FIFO)最初为空。有另一个mxn网格D的距离,所有元素都初始化为无穷大。

  1. 遍历所有瓷砖并推动队列中水砖的位置(如果网格为mxn,则需要O(mn))。此外,对于所有水瓦位置,D [pos] < - 0。
  2. 当队列不为空时,请执行以下操作: 2.1。从队列中弹出一个tile t。 2.2。检查所有相邻的瓷砖t_a(左,右,顶部,底部,对角线,也考虑角部情况,应在O(1)时间内找到),并检查是否D [t_a]&gt; D [t] + 1然后D [t_a]&lt; -D [t] + 1并将t_a推入队列。
  3. 对于mxn网格,步骤2的时间不应超过O(mn)。

答案 1 :(得分:1)

对地图中的所有图块进行广度优先搜索,从水砖作为根,然后沿着边缘到相邻图块。找到瓷砖的等级是它与水的距离。

有关在BFS期间跟踪深度的好方法,请参阅此答案:

How to keep track of BFS depth in C++