2D阵列中的总水容量,代表地形图

时间:2018-08-17 05:28:22

标签: algorithm flood-fill

我最近在一次采访中被问到这个问题,我不知道该如何实施。我希望有人可以指出正确的方向,以解决该问题。

问题陈述:给定2D整数数组,找到可以容纳的总水量。这些数字表示地图中的海拔高度(即山的高度)。水从最高的山脉流向山谷(从最高高度到最低高度)。

示例1:这是一个5 x 3矩阵。 10是最高峰。您可以假设水流下来并开始在坐标(3, 1)的图块2上收集。此图块将收集 7 个单位的水。在溢出到坐标为(2, 0) or (3, 0)的高度为9的相邻图块并流入海洋之前(假定边缘被海洋包围)。因此,此地图收集的总水量为 7

9  9  9
9 10  9
9  9  9
9  2  10
10 10 10

示例2:

    9   9  9  9  9 9
    9  10  9  8  2 4
    9   9  9 10  3 5
    9   2  2 10  3 5
   10 10  10 10  9 9

在这种情况下,水可以收集在以下坐标中:

  1. (3,1)&(3,2)。所以总容量=> 7 + 7 = 14
  2. (1,4)(2,4)&(3,4)。这些坐标可以分别存储2、1、1。因为在水开始从坐标(1,5)溢出到边缘之前,它们可以容纳的最大值是4。所以总容量=> 2 +1 + 1 = 4

总容量为14 + 4 = 18。

我尝试使用洪水填充解决此问题。通过找到从最高峰到最低峰的路径,并使用该路径来确定可以存储在最低高度的水。我不确定自己走的路是否正确。关于如何解决这个问题有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您在洪水泛滥的正确道路上。这是解决问题的一种方法。

首先,将所有边缘瓦片标记为完成。

然后创建一个内部图块的排序列表,从最低到最低。

对于列表中的每个图块,执行泛洪填充

  1. 查找与最低图块(山谷图块)处于同一级别的所有图块
  2. 找到最小的周围区域(出口区域)
  3. 确定是否有任何出口瓦片已完成

然后增加山谷砖的高度,以匹配出口砖的高度。如果出口瓷砖已完成,则所有山谷瓷砖现在都已完成。否则,请扩展山谷以包括出口地砖。


这是该算法与问题中第二个示例一起工作的方式。最初,边缘平铺完成,而内部平铺未完成。

enter image description here

假设右上角的2是第一个。出口瓦片是3。因此将2增加到3,将总水量增加1。然后,可以将3s增加到4,使总水量增加3。并且4结束了,所以山谷现在结束了。

enter image description here

下一个是左下角的2之一。洪水填充将找到两个山谷瓦片,而出口瓦片为9。因此我们可以将7加到两个瓦片中,将14加到总水量中。并且其中一个出口已经完成,所以山谷现在已经完成。

enter image description here

在这一点上,每个剩余的图块都与等于或更低的出口图块相邻,并且也完成了。因此,所有剩余的图块都标记为完成。总水量为1 + 3 + 14 = 18。