題目描述
在二維網格 grid 上,有 4 種類型的方格:
1 表示起始方格。且只有一個起始方格。
2 表示結束方格,且只有一個結束方格。
0 表示我們可以走過的空方格。
-1 表示我們無法跨越的障礙。
返回在四個方向(上、下、左、右)上行走時,從起始方格到結束方格的不同路徑的數目,每一個無障礙方格都要通過一次。
算法思路
一看題就知道,老DFS了。如何循跡?回溯算法!
因爲是DFS矩陣,所以先把“公式”擺上再說
self.m,self.n=len(grid),len(grid[0])
self.dire=[(0,1),(0,-1),(1,0),(-1,0)]
請注意,起始和結束方格可以位於網格中的任意位置。
結束位置不重要,我們首先要找到起始位置
for i in range(self.m):
for j in range(self.n):
#if grid[i][j]==0:
# self.k+=1
elif grid[i][j]==1:
x,y=i,j
每一個無障礙方格都要通過一次。
在到達結尾時如何判斷已經過所有無障礙位置?用一個參數計數走過了多少,然後對比矩陣中有多少無障礙位置0
#if grid[i][j]==0:
# self.k+=1
————
再就是回溯算法的主體:
def hel(x,y,n):
# x,y是初始位置座標,n計數走過了多少位置
# 結束判斷,滿足條件時self.res+1
if grid[x][y]==2:
if n==self.k+1:
self.res+=1
return
if n>self.k:return
# 滿足以上兩個條件時 return
# DFS的主體。
for i in self.dire:
if 0<=x+i[0]<self.m and 0<=y+i[1]<self.n and grid[x+i[0]][y+i[1]]!=-1:
# 將已經走過的位置標記爲障礙物
grid[x][y]=-1
hel(x+i[0],y+i[1],n+1)
grid[x][y]=0
完整算法
class Solution:
def uniquePathsIII(self, grid) -> int:
self.m,self.n=len(grid),len(grid[0])
self.res=0
self.dire=[(0,1),(0,-1),(1,0),(-1,0)]
self.k=0
for i in range(self.m):
for j in range(self.n):
if grid[i][j]==0:
self.k+=1
elif grid[i][j]==1:
x,y=i,j
def hel(x,y,n):
if grid[x][y]==2:
if n==self.k+1:
self.res+=1
return
if n>self.k:return
for i in self.dire:
if 0<=x+i[0]<self.m and 0<=y+i[1]<self.n and grid[x+i[0]][y+i[1]]!=-1:
grid[x][y]=-1
hel(x+i[0],y+i[1],n+1)
grid[x][y]=0
hel(x,y,0)
return self.res
執行用時 :56 ms, 在所有 Python3 提交中擊敗了92.17%的用戶
內存消耗 :13.7 MB, 在所有 Python3 提交中擊敗了25.00%的用戶