📌  相关文章
📜  在 2D 平面中从原点到达形状 (d, 0) 点所需的跳跃次数(1)

📅  最后修改于: 2023-12-03 14:50:50.435000             🧑  作者: Mango

题目介绍

对于一个在2D平面中从原点出发的小球,它一次可以上下或者左右移动一个单位长度。现给定一个目标位置(d, 0),编写一个函数计算小球到达此位置所需要的最少的跳跃次数。

思路分析

由于小球可以上下左右移动,因此可以考虑使用广度优先搜索(BFS)来求解。首先将起点加入队列,然后对于队列中的每个节点扩展子节点,即向上下左右四个方向扩展。如果子节点合法且未曾被访问过,就将其加入队列中,并更新其跳跃次数。

由于每个节点最多被访问一次,时间复杂度为O(n),其中n为搜索过的节点数。空间复杂度为O(n)。

代码实现

from queue import Queue

def jump_to_shape(d: int) -> int:
    """
    计算小球到达(d, 0)所需的最少跳跃次数
    :param d: int 目标距离
    :return: int 最少跳跃次数
    """
    # 初始化队列和跳跃次数
    q, step = Queue(), 0
    q.put((0, 0))   # 起点为(0, 0)
    visited = set() # 记录已访问过的节点

    # 广度优先搜索
    while not q.empty():
        size = q.qsize()
        for i in range(size):
            x, y = q.get()
            if x == d and y == 0:   # 到达目标位置
                return step
            # 扩展子节点
            for dx, dy in [(1, 0), (-1, 0), (0, 1), (0, -1)]:
                nx, ny = x + dx, y + dy
                if (nx, ny) not in visited and nx <= d:    # 合法节点
                    visited.add((nx, ny))
                    q.put((nx, ny))
        step += 1   # 更新跳跃次数

    return -1   # 没有到达目标位置,返回-1

代码实现使用了宽度优先搜索的方法进行求解,判断终点是否可以到达使用了比较简单的方式,即判断 x == d and y == 0 是否成立,如果成立则说明到达终点,并返回跳跃次数;否则就继续进行广度优先搜索。

总结

本题是一道比较经典的搜索题目,要求我们使用BFS算法来解决问题。基础的BFS算法思路和模板大家一定要掌握。同时,还要注意一些小细节,比如节点合法性的判断等。