Leetcode 2814. 避免淹死并到达目的地的最短时间【Plus题】 ...

打印 上一主题 下一主题

主题 1835|帖子 1835|积分 5505

1.标题基本信息

1.1.标题形貌

现给定一个 n * m 的索引从 0 开始的二维字符串网格 land,目前你站在为 “S” 的单元格上,你需要到达为 “D” 的单元格。在这片地区上还有另外三种类型的单元格:
“.”:这些单元格是空的。
“X”:这些单元格是石头。
“*”:这些单元格被沉没了。
每秒钟,你可以移动到与当前单元格共享边的单元格(如果它存在)。别的,每秒钟,与被沉没的单元格共享边的每个 空单元格 也会被沉没。
在你的旅程中,有两个需要留意的题目:
你不能踩在石头单元格上。
你不能踩在被沉没的单元格上,由于你会淹死(同时,你也不能踩在在你踩上时会被沉没的单元格上)。
返回从起始位置到达目的位置所需的 最小 时间(以秒为单元),如果不大概到达目的位置,则返回 -1。
留意,目的位置永世不会被沉没。
1.2.标题地点

https://leetcode.cn/problems/minimum-time-takes-to-reach-destination-without-drowning/description/
2.解题方法

2.1.解题思路

两次广度优先搜索
2.2.解题步骤

第一步,从所有”*”的位置(即被沉没的位置)开始进行广搜,利用times1矩阵标记被沉没的时间,不能被沉没的位置标记为inf
第二步,从”S”的位置开始进行广搜,并记录广搜到各处的时间,并跳过石头处和被沉没处,构建到达各处的时间矩阵times2
第三步,终极times2[“D处位置”]=inf阐明不能到达,否则返回所用时间
3.解题代码

Python代码
  1. from collections import deque
  2. class Solution:
  3.     def minimumSeconds(self, land: List[List[str]]) -> int:
  4.         # 思路:两次广搜
  5.         m, n = len(land), len(land[0])
  6.         # 第一步,从所有"*"的位置(即被淹没的位置)开始进行广搜,使用times1矩阵标记被淹没的时间,不能被淹没的位置标记为inf
  7.         times1 = [[inf] * n for _ in range(m)]
  8.         times2 = [[inf] * n for _ in range(m)]
  9.         que1 = deque()
  10.         que2 = deque()
  11.         dstR, dstC = 0, 0
  12.         for i in range(m):
  13.             for j in range(n):
  14.                 if land[i][j] == "*":
  15.                     times1[i][j] = 0
  16.                     que1.append((i, j))
  17.                 elif land[i][j] == 'S':
  18.                     times2[i][j] = 0
  19.                     que2.append((i, j))
  20.                 elif land[i][j] == 'D':
  21.                     dstR, dstC = i, j
  22.         time1 = 0
  23.         while que1:
  24.             time1 += 1
  25.             for _ in range(len(que1)):
  26.                 r, c = que1.popleft()
  27.                 for dr, dc in [[-1, 0], [0, -1], [1, 0], [0, 1]]:
  28.                     nr, nc = r + dr, c + dc
  29.                     if 0 <= nr < m and 0 <= nc < n and times1[nr][nc] == inf and land[nr][nc] != 'X' and land[nr][nc] != 'D':
  30.                         que1.append((nr, nc))
  31.                         times1[nr][nc] = time1
  32.         # print(times1)
  33.         # 第二步,从"S"的位置开始进行广搜,并记录广搜到各处的时间,并跳过石头处和被淹没处,构建到达各处的时间矩阵times2
  34.         time2 = 0
  35.         while que2:
  36.             time2 += 1
  37.             for _ in range(len(que2)):
  38.                 r, c = que2.popleft()
  39.                 for dr, dc in [[-1, 0], [0, -1], [1, 0], [0, 1]]:
  40.                     nr, nc = r + dr, c + dc
  41.                     if 0 <= nr < m and 0 <= nc < n and times2[nr][nc] == inf and land[nr][nc] != 'X' and time2 < times1[nr][nc]:
  42.                         que2.append((nr, nc))
  43.                         times2[nr][nc] = time2
  44.         # print(times2)
  45.         # 第三步,最终times2["D处位置"]=inf说明不能到达,否则返回所用时间
  46.         return times2[dstR][dstC] if times2[dstR][dstC] != inf else -1
复制代码
4.实行效果



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表