微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

二维数组从角到角的最小路径

如何解决二维数组从角到角的最小路径

我正在解决一个问题,我试图从输入 mxn 的左上角,即 (0,0) 到右下角,或 (m - 1,n - 1)二维数组。此外,数组的每个元素表示可以从该正方形进行什么样的跳跃。

例如,一个看起来像这样的表格:

1 2 1

1 1 1

1 1 1

最小路径为 3,因为您可以从 (0,0) 向右跳 1 格到 (0,1),向下跳 2 格到 (2,1),然后向右跳 1 格到(2,2) 的目的地。

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

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

解决方法

我认为问题在于您正在更新 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,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 还没有到达队列的顶部并且尚未被视为访问过。

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

您还两次将东添加到队列中。这不应该导致任何问题,但无论如何都值得解决

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。