问题:
题目来源:力扣(LeetCode)
难度:困难
分析:
相比于不同路径I和不同路径II,不同路径III增加了三个要求,一是可以在4个方向上行走,二是不允许走回头路的要求,三是每个路径都需要包含所有无障碍方格。
这里用回溯法解比较易懂。
首先遍历网格找到起始点,然后再4个方向上进行搜索。
搜索的时候注意,每条路径走过一个网格后将将其标记为-1(障碍),这样就保证了不允许走回头路的条件,搜索下一个路径时恢复网格原有状态。
当遇到终点时,终止回溯。判断走过的网格数是否等于无障碍网格总数,如果是,则找到了一条符合要求的路径,保存。
解决方法:
1:回溯法
class Solution:
def uniquePathsIII(self, grid: List[List[int]]) -> int:
rows = len(grid)
cols = len(grid[0])
steps,m,n = 1,0,0
count = 0
for r,row in enumerate(grid):
for c,val in enumerate(row):
if val == 1:
m,n = r,c
if val == 0:
steps += 1
def traceback(r,c,step):
nonlocal count
if grid[r][c] == 2:
if step == 0:
count += 1
return
grid[r][c] = -1
for i,j in [(r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)]:
if 0<=i<rows and 0<=j<cols and grid[i][j] != -1:
temp = grid[i][j]
traceback(i, j, step-1)
grid[i][j] = temp
traceback(m, n, steps)
return count