我最近在一次采访中被问到这个问题,我不知道该如何实施。我希望有人可以指出正确的方向,以解决该问题。
问题陈述:给定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
在这种情况下,水可以收集在以下坐标中:
总容量为14 + 4 = 18。
我尝试使用洪水填充解决此问题。通过找到从最高峰到最低峰的路径,并使用该路径来确定可以存储在最低高度的水。我不确定自己走的路是否正确。关于如何解决这个问题有什么想法吗?
答案 0 :(得分:3)
您在洪水泛滥的正确道路上。这是解决问题的一种方法。
首先,将所有边缘瓦片标记为完成。
然后创建一个内部图块的排序列表,从最低到最低。
对于列表中的每个图块,执行泛洪填充
然后增加山谷砖的高度,以匹配出口砖的高度。如果出口瓷砖已完成,则所有山谷瓷砖现在都已完成。否则,请扩展山谷以包括出口地砖。
这是该算法与问题中第二个示例一起工作的方式。最初,边缘平铺完成,而内部平铺未完成。
假设右上角的2是第一个。出口瓦片是3。因此将2增加到3,将总水量增加1。然后,可以将3s增加到4,使总水量增加3。并且4结束了,所以山谷现在结束了。
下一个是左下角的2之一。洪水填充将找到两个山谷瓦片,而出口瓦片为9。因此我们可以将7加到两个瓦片中,将14加到总水量中。并且其中一个出口已经完成,所以山谷现在已经完成。
在这一点上,每个剩余的图块都与等于或更低的出口图块相邻,并且也完成了。因此,所有剩余的图块都标记为完成。总水量为1 + 3 + 14 = 18。