【力扣】980:不同路徑 III | 深度優先搜索 DFS | 回溯算法

題目描述

在二維網格 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%的用戶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章