Leetcode - 63 개 다른 경로 II 파이썬

면책 조항 :이 문서는 원본입니다, 판권 소유 https://blog.csdn.net/weixin_41864878/article/details/90520331

왼쪽 코너 MXN 그리드에 위치한 로봇 (아래 "시작"이라는 점 그림을 시작).

로봇은 오른쪽이나 아래로 한 단계를 이동할 수 있습니다. 로봇 ( "마침"이라는 다음 그림) 그리드의 오른쪽 하단 모서리에 도달하려고합니다.

이제 그리드 장애물을 고려하십시오. 그래서 얼마나 많은 서로 다른 경로 왼쪽 상단에서 오른쪽 하단에있을 것인가?

빈 그리드 위치를 각각 1과 0이 표현하는 장애물.

설명 : m의 값 N 이상 100 아니다.

예 1 :

입력 : [[0,0,0], [0,1,0], [0,0,0]] 출력 : 2 설명 : 3 × 3 격자 장애물의 중간.
정상에서 두 개의 서로 다른 경로의 총의 오른쪽 아래 왼쪽 :

  1. 마우스 오른쪽 -> 오른쪽 -> 아래 -> 아래로
  2. 아래로 -> 아래 -> 우측 -> 우측

거기에 많은 경계 조건은 다음 다르지 않다 (62)로 찍은
기본 방정식 :
하지 않을 때 장애물 단계 [I] [J] = 단계 [I-1] [J] + 단계 [I]은 [J-1]
이고 장애물 단계 [I] [J] = 0

class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        if not obstacleGrid: return 0
        if obstacleGrid[len(obstacleGrid)-1][len(obstacleGrid[0])-1]: return 0 #如果右下角是个障碍物那么就不能到达,返回0
        if len(obstacleGrid) == len(obstacleGrid[0]) == 1: return 1 #只有起始点(这里题目好像默认起始点不会是障碍点的)
        
        #初始矩阵的构建,非常重要,这里全部要按零初始化,第一行或者第一列出现障碍物后,后面的值要全部都是0
        step = [[0 for i in range(len(obstacleGrid[0]))] for j in range(len(obstacleGrid))]
        for i in range(len(obstacleGrid[0])):
            if not obstacleGrid[0][i]:
                step[0][i] = 1
            else:
                if len(obstacleGrid) == 1: return 0  #如果是单行,出现障碍物,不能到达
            	break
        for i in range(len(obstacleGrid)):
            if not obstacleGrid[i][0]:
                step[i][0] = 1
            else: 
            	if len(obstacleGrid[0]) == 1: return 0
            	break
            
        #标准动规   
        for i in range(1, len(obstacleGrid)):
            for j in range(1, len(obstacleGrid[0])):
                step[i][j] = step[i-1][j] + step[i][j-1] if not obstacleGrid[i][j] else 0
        return step[len(obstacleGrid)-1][len(obstacleGrid[0])-1] 

추천

출처blog.csdn.net/weixin_41864878/article/details/90520331