当前位置: 首页 > 知识库问答 >
问题:

二维阵列中的总水量,表示地形图

程举
2023-03-14

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

问题陈述:给定一个二维整数数组,找出可以容纳的总水量。这些数字表示地图中的高程(即山的高度)。水从最高的山流到山谷(从最高的高度到最低的高度)。

示例1:这是一个5 x 3的矩阵。10是最高峰。您可以假设水向下流动,并开始在坐标处的瓷砖2处收集。这块瓷砖将收集7单位的水。在坐标(2,0)或(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)

总容量为14 4=18。

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

共有1个答案

马峻
2023-03-14

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

首先,将所有边缘瓷砖标记为已完成。

然后创建内部平铺的排序列表,首先是最下面的平铺。

对列表中的每个磁贴执行整体填充,以

  1. 查找与最低平铺(山谷平铺)处于同一级别的所有平铺

然后增加山谷瓦片的水平以匹配出口瓦片的水平。如果出口瓦片完成,那么所有的山谷瓦片现在都完成了。否则,扩展山谷以包括出口瓦片。

下面是算法如何与问题中的第二个示例一起工作。最初,边缘图块完成,而内部图块没有完成。

假设右上角的2是第一个。出口瓷砖为3。因此,将2增加到3,将1添加到总水量中。然后3s可以增加到4,总水量增加3。4号完成了,所以山谷现在完成了。

接下来是左下角的2之一。洪水填充会找到两个山谷瓦片,出口瓦片是9。所以我们可以在两个瓦片上添加7,在总水量上添加14。其中一个出口完成了,所以山谷现在完成了。

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

 类似资料:
  • 我想创建一个由任意高度的正方形组成的高度场贴图。给定一个NxN数组,我想要每一个大小为MxM的正方形,其中M 0.2, 0.2, 0.6, 0.6, 0.1, 0.1, 0.2, 0.2, 0.6, 0.6, 0.1, 0.1, 0.5, 0.5, 0.3, 0.3, 0.8, 0.8, 0.5, 0.5, 0.3, 0.3, 0.8, 0.8, 0.6, 0.6, 0.4, 0.4, 0.9,

  • 我是编程新手,我有一个任务要求从一维数组创建二维数组。我想到了这一点(没有任何外部来源的帮助,因为这会剥夺学习经验)。它适用于我们教授的测试输入,我只是想知道这是一个丑陋/低效的解决方案。 测试输入:twoDArray([1,2,3,4,5],3)输出将是:[[1,2,3],[4,5]]

  • 为什么上面的代码不起作用,我应该如何纠正?

  • 我正在编写一个代码,它是一个让用户根据他们单击的位置在屏幕上创建圆圈的程序。我尝试的是在第一个事件处理程序中放置createnew cle方法,但它所做的只是给我带来问题。到目前为止,我正在尝试以不同的方式处理问题。我现在使用ArrayList将所有形状组合在一起并将它们显示在窗格上。但是当我运行代码时,圆圈不会显示。 这是我的代码:

  • 问题内容: 我想获取所有列的总和,但是我不断收到出站异常。这是我得到的输出: 问题答案: 您的外部for循环条件给您带来了问题。这是您的循环:- 现在,当达到该值时,您正在尝试访问。这将引发异常。 由于每个内部数组的大小都相同,因此可以 将循环更改为 :- 或者,甚至更好的是,只需事先存储一些变量。但这并没有太大的区别。 我还建议您使用更好的方法来计算列的总和。避免首先迭代行。保持迭代正常,大概是

  • 问题内容: 我试图创建此代码以输入m x n矩阵。我打算输入,但是代码产生了。当我输入其他m×n矩阵时,也会发生相同的情况,代码会产生行数相同的m×n矩阵。 也许您可以帮助我找到我的代码有什么问题。 问题答案: 问题出在初始化步骤上。 这段代码实际上使您的每一行都引用相同的对象。如果任何列中的任何项目发生更改-其他所有列都将发生变化: 您可以在嵌套循环中初始化矩阵,如下所示: 或者,通过使用列表理