Unique Paths in a Grid with Obstacles Problem in Java

2025年3月29日 | 阅读 4 分钟

在大多数动态规划问题中,最常遇到的场景之一是从网格的左上角到右下角计算可能出现的不同路径的数量。然而,如果目标设置在网格的特定标记点上,并且网格中存在阻碍达成这些标记的障碍物,问题就会变得复杂。

在本节中,将详细介绍“网格带障碍的唯一路径”问题及其解决方案,并提供 Java 代码实现。对于可能路径的数量和避开障碍物,让我们考虑动态规划方法。

问题概述

问题是计算步数的排列数量,就像在棋盘上一样,从左上角单元格开始,到达 m x n 矩阵的右下角,其中一些单元格被填充了“障碍”。允许的移动是向右和向下的步数,此外,任何包含障碍的单元格都不允许任何路径通过。

我们提供了一个 m x n 的网格,其中:

障碍物表示值为 1。

值为 0 用于未使用的空单元格,用于数据存储元素的增长。

目标是确定从左上角的起始状态单元格出发,根据某些条件,到达右下角单元格而不遇到 X 或进入包含 X 的单元格的路径数量。

解法思路

动态规划表初始化:我们将使用 dp 进行必要的计算,dp[i][j] 表示到达单元格 i, j 的路径数量。如果单元格包含障碍物,即单元格值为 0,则 dp[i][j] 设置为 0,因为没有任何路径可以穿过它。

填充 DP 表

  • 从左上角开始。如果起始单元格包含障碍物,则不存在路径,结果为零。
  • 对于第一行和第一列,所有单元格只能通过向右或向下的移动到达。因此,如果在这些单元格中没有遇到障碍物,它们将继承前面单元格提供的路径数量。
  • 网格的其余部分将被称为位置 (i, j) 的单元格,相邻单元格是单元格 (i-1, j) 和单元格 (i, j-1),dp[i][j] = dp[i - 1][j] + dp [i][j - 1],其中包含 i 和 j 值的单元格不是障碍物。

最终解决方案:以上所有值将存储在变量 dp[m-1][n-1] 中,它将包含到达右下角单元格的路径数量。

文件名:GridUniquePathsWithObstacles.java

输出

Number of unique paths: 2

注意事项和边缘情况

如果网格大小为 1x1,并且唯一的单元格中有一个障碍物,则输出必须为 = 0。

如果网格的行或列为零,则输出为零,这意味着无法形成有效的路径。

如果没有限制,网格也应该能够工作,并计算不同路径的数量,这与“唯一路径”问题相同。

时间和空间复杂度

时间复杂度:该解决方案的时间复杂度为 O(m * n),因为在最坏的情况下,网格中的每个单元格都会被访问一次。

空间复杂度:空间复杂度也为 O(m * n),因为使用了二维 dp 表。然而,由于我们只需要上一行来计算当前行,因此可以使用一维数组将其优化到 O(n)。

结论

网格带障碍的唯一路径问题可以归类为动态规划问题,可以通过二维 DP 表高效解决。此方法确保我们在应对挑战时,能够有序且高效地计算所有可能的路径。

在本文档中,我们研究了边缘情况和解决方案的初始化,所提供的解决方案能够处理包含多个障碍物的网格问题。