1. 程式人生 > >25.不同路徑II-Leetcode 062(python)

25.不同路徑II-Leetcode 062(python)

  • 題目描述

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。

現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?

網格中的障礙物和空位置分別用 10 來表示。

說明:m 和 n 的值均不超過 100。

  • 示例

示例 1:

輸入:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
輸出: 2
解釋:
3x3 網格的正中間有一個障礙物。
從左上角到右下角一共有 2
條不同的路徑: 1. 向右 -> 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 -> 向右
  • 解決思路

仍舊是動態規劃的方法,通過建立一個二維的表格記錄走到網格每個位置的路徑數。與上一道題幾乎是一模一樣的,不同僅僅在於有障礙,所以我們只需啊在上一題的基礎上加上一條判斷語句就行:
1. 如果當前網格的值為0,和上一題一樣
2. 如果當前網格的值為1,那麼,到此網格的路徑數歸0(不能到嘛,因為有障礙)
所以,對上一題的程式碼略作修改:

  • 程式碼
class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        m = len(obstacleGrid)
        if m == 0 or obstacleGrid[0][0] == 1:
            return 0
        n = len(obstacleGrid[0])
        record = [[1 for i in range(n)] for j in range(m)]
        for i in range(m):
            for j in range(n):
                if obstacleGrid[i][j] == 1:
                    record[i][j] = 0
                elif j == 0:
                    record[i][j] = record[i - 1][j]
                elif i == 0:
                    record[i][j] = record[i][j - 1]
                else:
                    record[i][j] = record[i - 1][j] + record[i][j - 1]
        return record[m - 1][n - 1]