Leetcode 3552. Grid Teleportation Traversal

  • [Leetcode 3552. Grid Teleportation Traversal](#Leetcode 3552. Grid Teleportation Traversal)
    • [1. 解题思路](#1. 解题思路)
    • [2. 代码实现](#2. 代码实现)

1. 解题思路

这一题的话核心就是一个广度优先遍历,我们只需要从原点开始,一点点考察其所能到达的位置,直至其最终到达终点即可。

唯一特殊的是,考虑到传送的存在,这里会有些特殊操作,不难发现,一个端口至多发生一次传送,否则必然可以优化路线,因此我们只需要考察每一个端口值上是否有过传送即可。

2. 代码实现

给出python代码实现如下:

python 复制代码
class Solution:
    def minMoves(self, matrix: List[str]) -> int:
        n, m = len(matrix), len(matrix[0])
        teleportation = defaultdict(list)
        for i in range(n):
            for j in range(m):
                if matrix[i][j] in "#.":
                    continue
                teleportation[matrix[i][j]].append((i, j))
                
        seen = {(0, 0)}
        q = [(0, 0, 0, 0)]
        
        def add_teleportation(step, i, j, status):
            nonlocal seen, q
            if matrix[i][j] not in "#." and (status & (1 << (ord(matrix[i][j]) - ord('A'))) == 0):
                for ti, tj in teleportation[matrix[i][j]]:
                    if (ti, tj) not in seen:
                        heapq.heappush(q, (step, ti, tj, status | (1 << (ord(matrix[i][j]) - ord('A')))))
                        seen.add((ti, tj))
            return
        
        add_teleportation(0, 0, 0, 0)
        
        while q != []:
            step, i, j, status = heapq.heappop(q)
            if (i, j) == (n-1, m-1):
                return step
            if i+1 < n and (i+1, j) not in seen and matrix[i+1][j] != "#":
                heapq.heappush(q, (step+1, i+1, j, status))
                seen.add((i+1, j))
                add_teleportation(step+1, i+1, j, status)
            if j+1 < m and (i, j+1 ) not in seen and matrix[i][j+1] != "#":
                heapq.heappush(q, (step+1, i, j+1, status))
                seen.add((i, j+1))
                add_teleportation(step+1, i, j+1, status)
            if i-1 >= 0 and (i-1, j) not in seen and matrix[i-1][j] != "#":
                heapq.heappush(q, (step+1, i-1, j, status))
                seen.add((i-1, j))
                add_teleportation(step+1, i-1, j, status)
            if j-1 >= 0 and (i, j-1 ) not in seen and matrix[i][j-1] != "#":
                heapq.heappush(q, (step+1, i, j-1, status))
                seen.add((i, j-1))
                add_teleportation(step+1, i, j-1, status)
        return -1

提交代码评测得到:耗时6943ms,占用内存147.7MB。

相关推荐
Espresso Macchiato18 小时前
Leetcode 3551. Minimum Swaps to Sort by Digit Sum
leetcode·排序·leetcode medium·leetcode 3551·leetcode周赛450
Espresso Macchiato4 天前
Leetcode 3543. Maximum Weighted K-Edge Path
leetcode·leetcode medium·图遍历·leetcode 3543·leetcode双周赛156
Espresso Macchiato18 天前
Leetcode 3532. Path Existence Queries in a Graph I
leetcode medium·dsu·leetcode 3532·leetcode周赛447·uf
Espresso Macchiato25 天前
Leetcode 3523. Make Array Non-decreasing
leetcode··leetcode medium·leetcode 3523·leetcode周赛446
Espresso Macchiato4 个月前
Leetcode 3418. Maximum Amount of Money Robot Can Earn
leetcode·动态规划·leetcode medium·leetcode 3418·leetcode周赛432
深度混淆4 个月前
C#,图论与图算法,有向图(Direct Graph)广度优先遍历(BFS,Breadth First Search)算法与源程序
数据结构·深度优先·图论·bfs·广度优先遍历
Espresso Macchiato5 个月前
Leetcode 3388. Count Beautiful Splits in an Array
leetcode·z算法·leetcode medium·leetcode周赛428·leetcode 3388
Espresso Macchiato7 个月前
Leetcode 3316. Find Maximum Removals From Source String
leetcode·动态规划·leetcode medium·leetcode 3316·leetcode双周赛141
Espresso Macchiato7 个月前
Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II
leetcode·滑动窗口·leetcode medium·leetcode 3306·leetcode周赛417