タイトル
ロボットの左上隅に位置する M X N (下図の「開始」マーク)の格子。
ロボットは、任意の時点でダウンまたは右に移動することができます。ロボットは、(下図の「完了」マーク)グリッドの右下隅に到達しようとしています。
いくつかの障害がグリッドに追加された場合は今検討してください。どのように多くのユニークなパスがあるだろうか?
障害物や空きスペースをとしてマークされている 1
と 0
、それぞれのグリッドに。
注: M と Nは 、ほとんど100であろう。
例1:
入力: [ [0,0,0]、 [0,1,0]、 [0,0,0] ] 出力: 2 説明: 上記3×3グリッドの中央に1つの障害物があります。 :右下隅に到達するための2つの方法があります >右- - >ダウン- >ダウン1.右 2.ダウン- >下- >右- >右
思考
再帰と、正常なパスである[I] [J] =パス[I]、[J-1] +パス[I-1] [j]は、
格子が障害物である場合、パス[i] [j]は0 =
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m,n = len(obstacleGrid),len(obstacleGrid[0])
paths = [[0]*n for i in range(m)]
for i in range(m):
for j in range(n):
if i == 0 and j == 0:
if obstacleGrid[i][j] == 1:
return 0
else:
paths[i][j] = 1
elif j == 0:
if obstacleGrid[i][j] == 1:
paths[i][j] = 0
else:
paths[i][j] = paths[i-1][j]
elif i == 0:
if obstacleGrid[i][j] == 1:
paths[i][j] = 0
else:
paths[i][j] = paths[i][j-1]
else:
if obstacleGrid[i][j] == 1:
paths[i][j] = 0
else:
paths[i][j] = paths[i-1][j] + paths[i][j-1]
return paths[m-1][n-1]