我有一张土地和水的二维地图,如下所示(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
这种方法有效,但速度相当慢,特别是在水砖很少的情况下。
是否有更快的算法来查找每块地砖与水的距离?
答案 0 :(得分:2)
我们可以做类似以下的事情(类似于BFS,但可能从多个来源开始):
队列(FIFO)最初为空。有另一个mxn网格D的距离,所有元素都初始化为无穷大。
对于mxn网格,步骤2的时间不应超过O(mn)。
答案 1 :(得分:1)
对地图中的所有图块进行广度优先搜索,从水砖作为根,然后沿着边缘到相邻图块。找到瓷砖的等级是它与水的距离。
有关在BFS期间跟踪深度的好方法,请参阅此答案: