【力扣】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%的用户

你可能感兴趣的:(力扣日记)