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

二维阵列角点到角点的最小路径

孟海
2023-03-14

我正在处理一个问题,我试图从左上角,即(0,0),到右下角,或(m-1,n-1),输入m x n 2D数组。此外,数组的每个元素表示可以从该方块进行何种跳跃。

例如,一个表看起来像:

1 2 1

1 1 1

1 1 1

最小路径为3,因为您可以从(0,0)开始,向右跳1个方块到(0,1),向下跳2个方块到(2,1),然后向右跳1个方块到(2,2)的目标。

我当前的实现使用BFS,在BFS中,我将每个未访问的连接方块推到一个队列中,直到到达拐角处或无法继续;在此过程中,我更新了一个单独的2D数组,该数组包含从起始方块到达实际板上特定坐标所需的移动次数。

我的代码适用于我抛出的许多测试,但对于一些看似随机的测试用例,它返回了错误的移动次数(比实际移动次数高出很多)。我不知道为什么会这样!任何关于我可能出错的地方的建议都将不胜感激。

共有1个答案

骆昊阳
2023-03-14

我认为问题在于,您正在更新distanceArray,而没有将该正方形设置为已访问(这通常会防止在distanceArray中覆盖该正方形),并且仅在该正方形到达队列顶部时才将其标记为已访问。这意味着队列前面的另一条路径可能会在标记为已访问之前覆盖该距离。

下面是这个问题的一个例子

Board:
1 1 1 1  
1 2 1 1  
1 1 1 1  
1 2 1 1  
Queue:   0,0 1,0 0,1 2,0 1,1 1,1 0,2 3,0 2,1 *3,1* 1,3 1,2 0,3 *3,1*   
Distance: 0   1   1   2   2   2   2   3   3   *3*   3   3   3   *4*  

正如您所看到的,访问1,1会将3,1排成距离为3的队列,但访问3,0也会将3,1排成队列,并将其距离覆盖为4,因为3,1尚未到达队列的顶部,并且尚未被视为已访问。

有多种方法可以解决这个问题。最简单的方法可能是在您加入时将其设置为已访问。然而,这在你的确切情况下是不太可行的,因为你使用董事会来标记访问。因此,您可能希望将访问过的信息存储在其他地方。您可以将板方块从int更改为一个对象,该对象还保存它们访问过的信息以及它们的步长值(同时添加它们的最短路径距离)。
或者,如果你不想重写很多以前的代码,你可以制作另一个2D数组来存储访问过的信息,类似于您的距离数组。

您还将向队列中添加两次east。这不应该引起任何问题,但无论如何都值得解决

 类似资料:
  • 我在使最短路径算法正常工作时遇到问题。我有一个20 x 20的2d数组,其中包含表示城市之间道路的边权重。我没有得到城市间最短路径的正确结果。如有任何帮助,我们将不胜感激。 我的2d阵列看起来像:X轴=城市1-20,y轴=城市1-20。 这是我到目前为止的代码: 对于城市1和2之间的最短路径,我的程序给出了总距离276。经历19、5、16、11 正确的解决方案是总距离225。路径应该19, 5,

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

  • 主要内容:BitArray 类中的属性,BitArray 类中的方法在 C# 中,BitArray 类用来管理一个紧凑型的位值数组,数组中的值均为布尔类型,其中 true(1)表示此位为开启,false(0)表示此位为关闭。 当您需要存储位(英文名“bit”数据存储的最小单位,也可称为比特),但事先又不知道具体位数时,就可以使用点阵列。当需要访问点阵列中的元素时,可以使用整型索引从点阵列中访问指定元素,索引从零开始。 BitArray 类中的属性 下表列出了 Bi

  • 在我的模板中,我有一个字段和两个按钮: 在我的组件. ts文件中,我有: 这个。update()函数将myValue放入大JSON对象的适当字段中,并将其发送到服务器。 问题:当用户在短时间内点击10次加号/减号按钮时,将发送10次请求。但我只想发送一次请求-在上次单击后0.5秒。怎么做?

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

  • 我试图将一个2d数组中的特定元素添加到另一个数组中,添加的过程是在数组的第一行选择最小的元素,并将该元素添加到同一位置的另一个2d数组中,例如: 2 22 3 5 1 54 7 3 10 20 22 21 这里,第一行中的最小元素是2,所以应该在相同的位置将2添加到另一个2d数组中,对于第二行,1是最小元素,所以我们也将1添加到另一个2d数组中,第三行中的最小元素是3,最后一行,第四行,最小的元素