Leetcode题63、不同路径III(Python题解)美团面试题

不同路径系列题包含3道:
不同路径I
不同路径II

问题

在这里插入图片描述
在这里插入图片描述

题目来源:力扣(LeetCode)

leetcode63.不同路径III

难度:困难

分析
相比于不同路径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
		  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值