免責事項:この記事は、オリジナルである、すべての権利予約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説明:3x3のグリッド障害の真ん中。
左上から2つの異なるパスの合計の右下隅に:
- 右 - >右 - >下 - >ダウン
- ダウン - >ダウン - >右 - >右
そこに多くの境界条件は、次に62内に取り込まは異ならない
:基本的な方程式
ではない障害、ステップ[I] [J] [J] +工程[I] [J-1]は[I-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]