3286. 穿越网格图的安全路径

Powered by:NEFU AB-IN

Link

3286. 穿越网格图的安全路径

题意

给你一个 m x n 的二进制矩形 grid 和一个整数 health 表示你的健康值。

你开始于矩形的左上角 (0, 0) ,你的目标是矩形的右下角 (m - 1, n - 1) 。

你可以在矩形中往上下左右相邻格子移动,但前提是你的健康值始终是 正数 。

对于格子 (i, j) ,如果 grid[i][j] = 1 ,那么这个格子视为 不安全 的,会使你的健康值减少 1 。

如果你可以到达最终的格子,请你返回 true ,否则返回 false 。

注意 ,当你在最终格子的时候,你的健康值也必须为 正数 。

思路

  1. 双端队列广搜
    当值只有01时使用,0放队首,1放对尾

  2. 记忆化搜索
    正常dfs,当dfs一条路径时,记录哪些地方走过了,之后回溯,然后不走不符合要求的地方

代码

class Solution:
    def findSafeWalk(self, grid: List[List[int]], health: int) -> bool:
        m, n = len(grid), len(grid[0])
        dis = [[inf] * n for _ in range(m)]
        dis[0][0] = grid[0][0]
        q = deque([(0, 0)])
        while q:
            i, j = q.popleft()
            for x, y in (i, j + 1), (i, j - 1), (i + 1, j), (i - 1, j):
                if 0 <= x < m and 0 <= y < n:
                    g = grid[x][y]
                    if dis[i][j] + g < dis[x][y]:
                        dis[x][y] = dis[i][j] + g
                        if g == 0:
                            q.appendleft((x, y))
                        else:
                            q.append((x, y))
        return dis[-1][-1] < health
class Solution:
    def findSafeWalk(self, grid: List[List[int]], health: int) -> bool:
        m, n = len(grid), len(grid[0])

        visited = [[False] * n for _ in range(m)]

        @cache
        def dfs(i: int, j: int, h: int) -> bool:
            if not (0 <= i < m) or not (0 <= j < n) or h <= 0 or visited[i][j]:
                return False
            
            visited[i][j] = True
            h -= grid[i][j]

            if i == m - 1 and j == n - 1 and h > 0:
                return True

            if (dfs(i - 1, j, h) or  # 上
                dfs(i, j - 1, h) or  # 左
                dfs(i, j + 1, h) or  # 右
                    dfs(i + 1, j, h)):   # 下
                return True

            visited[i][j] = False
            return False

        return dfs(0, 0, health)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NEFU AB-IN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值