欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 3286. 穿越网格图的安全路径

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

2025/1/19 6:21:01 来源:https://blog.csdn.net/qq_45859188/article/details/142287668  浏览:    关键词:3286. 穿越网格图的安全路径

Powered by:NEFU AB-IN

Link

文章目录

  • 3286. 穿越网格图的安全路径
    • 题意
    • 思路
    • 代码

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] + gif 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)]@cachedef 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 Falsevisited[i][j] = Trueh -= grid[i][j]if i == m - 1 and j == n - 1 and h > 0:return Trueif (dfs(i - 1, j, h) or  # 上dfs(i, j - 1, h) or  # 左dfs(i, j + 1, h) or  # 右dfs(i + 1, j, h)):   # 下return Truevisited[i][j] = Falsereturn Falsereturn dfs(0, 0, health)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com