【发布时间】:2021-07-02 21:00:13
【问题描述】:
我正在解决一个问题,我试图从输入 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,我将每个未访问的连接方推入队列,直到到达角落或无法继续;在此过程中,我更新了一个单独的二维数组,其中包含从起始方块到达实际棋盘上特定坐标所需的移动次数。
我的代码适用于我对其进行的许多测试,但对于一些看似随机的测试用例,它会返回错误的移动次数(比实际数字高很多)。我不知道为什么会这样!任何关于我可能出错的地方的建议都将非常感激。
【问题讨论】:
-
能否添加解决方案失败的案例?
-
我认为您的问题是您将节点标记为已访问,这样您就不会在“稍后”路径上考虑它们,即使它们在第二个(或第三个或第四个)的步骤更少...) 时间循环。当然,探索所有可能的路径将是浪费时间。也许您可以使用一个标准来检查新距离是否小于前一个距离,而不是禁止访问过的节点。
-
@MOehm 但我认为这适合 BFS 对吧?自从您在此过程中第一次到达特定节点以来,它始终是到达该节点所需的最少移动次数。
-
如果您的所有步骤都具有相同的长度,那将是正确的。你的可变步长打破了这一点。
-
我还没有测试过,但是想想一个 5×6 的网格,顶行
15111,底行41111和所有其他行11111。最短路径将有 4 个步骤:e, s (5), w, e (4)。你的算法先向南走,可能会走 s, s, s, s, s, e (4)。这种情况甚至可能过于简单,因为您将首先到达短路径上的西南广场。也许问题只在复杂的情况下表现出来,但这就是构建这种情况的方法:尝试到达各种路径上的节点。此外,解决方案显示出一个对称性:转置迷宫应该给出与原始迷宫相同的答案。
标签: java algorithm queue breadth-first-search