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 Macchiato4 天前
Leetcode 3781. Maximum Score After Binary Swaps
·leetcode medium·leetcode3781·leetcode双周赛172
Espresso Macchiato5 天前
Leetcode 3771. Total Score of Dungeon Runs
leetcode medium·leetcode 3771·leetocde周赛479
Espresso Macchiato5 天前
Leetcode 3790. Smallest All-Ones Multiple
leetcode medium·leetcode 3790·leetcode周赛482
Espresso Macchiato24 天前
Leetcode 3767. Maximize Points After Choosing K Tasks
leetcode medium·leetcode双周赛171·leetcode 3767
Espresso Macchiato24 天前
Leetcode 3765. Complete Prime Number
leetcode medium·leetcode双周赛171·leetcode 3765
Espresso Macchiato25 天前
Leetcode 3766. Minimum Operations to Make Binary Palindrome
leetcode medium·leetcode 3766·leetcode双周赛171
逝雪Yuki1 个月前
简单多源BFS问题
算法·leetcode·bfs·广度优先遍历
Espresso Macchiato2 个月前
Leetcode 3741. Minimum Distance Between Three Equal Elements II
滑动窗口·leetcode medium·leetcode 3741·leetcode周赛475
Espresso Macchiato3 个月前
Leetcode 3710. Maximum Partition Factor
leetcode·职场和发展·广度优先遍历·二分法·leetcode hard·leetcode 3710·leetcode双周赛167
Espresso Macchiato3 个月前
Leetcode 3702. Longest Subsequence With Non-Zero Bitwise XOR
leetcode medium·异或操作·leetcode 3702·leetcode周赛470