返回

1041. 机器人是否受困于圆圈 - Python 代码和算法详解

后端

机器人的困境:探索圆圈中的受困机器人

试想一下,你拥有一台机器人,但它只能在一个完美圆圈的范围内移动。它只能向四个方向移动:上、下、左、右。当你输入一组指令时,机器人会根据指令沿这些方向移动。现在,一个有趣的问题出现了:机器人能否在执行完一系列指令后返回到它的初始位置?

深入了解问题

为了解决这个问题,我们需要首先理解机器人的移动模式。当机器人移动时,它可以在四个方向上移动:

  • 向上 (U)
  • 向下 (D)
  • 向左 (L)
  • 向右 (R)

执行完指令后,机器人会在圆圈中占据一个特定的位置,其位置由两个因素决定:

  • 它与圆心之间的距离
  • 它与水平轴(x 轴)之间的夹角

解决方案:探索方向变化

为了确定机器人能否返回其初始位置,我们需要分析其在执行指令过程中的方向变化。当机器人执行指令时,它可以向左转(L)、向右转(R)或向前移动(UD)。

左转 (L): 向左转会将机器人的方向逆时针旋转 90 度。
右转 (R): 向右转会将机器人的方向顺时针旋转 90 度。
向前移动 (U 或 D): 向前移动不会改变机器人的方向,但会改变其与圆心的距离。

分析方向变化的累积效应

通过分析机器人方向变化的累积效应,我们可以确定机器人能否返回其初始位置。

  • 如果机器人只执行了 左转 (L)右转 (R) 操作,那么它将永远无法返回其初始位置,因为其方向会不断改变。
  • 如果机器人只执行了 向前移动 (U 或 D) 操作,那么它将能够返回其初始位置,前提是它在水平轴 (x 轴) 两侧移动的距离相等。

代码示例:Python 解决方案

def is_robot_bounded(instructions):
    """
    :type instructions: str
    :rtype: bool
    """

    # 初始化机器人的位置和方向
    x = 0
    y = 0
    direction = 0  # 0 表示北,1 表示东,2 表示南,3 表示西

    # 指令到方向变化的映射
    direction_changes = {
        'U': (0, 1),
        'D': (0, -1),
        'L': (-1, 0),
        'R': (1, 0)
    }

    # 遍历指令并更新机器人的位置和方向
    for instruction in instructions:
        if instruction == 'L':
            direction = (direction - 1) % 4
        elif instruction == 'R':
            direction = (direction + 1) % 4
        else:
            dx, dy = direction_changes[instruction]
            x += dx
            y += dy

    # 如果机器人回到原点,则返回 True
    return x == 0 and y == 0

常见问题解答

1. 如果机器人最初面向北,执行指令 RUL,它会返回其初始位置吗?

不,它不会。执行 R 会将机器人转向东,执行 U 会使其远离原点,执行 L 会将其转向北,但它不再位于原点。

2. 如果机器人最初面向西,执行指令 LLDDUURR,它会返回其初始位置吗?

是,它会。两个 L 会将机器人转向南,然后 DDUU 会将其在 y 轴上的位置恢复到原点。最后,两个 RR 会将其转向西并返回原点。

3. 如果机器人最初面向东,执行指令 UDRLR,它会返回其初始位置吗?

不,它不会。UDRLR 会使机器人不断改变方向,在圆圈中移动,但不会返回其初始位置。

4. 机器人能否永远停留在圆圈中移动,而不会返回其初始位置?

是,可以。如果机器人不断左转或右转,它将永远停留在圆圈中移动,而不会返回其初始位置。

5. 如果机器人执行指令 URDLR,它会返回其初始位置吗?

是,它会。URD 会使机器人逆时针移动 90 度,L 会使其左转 90 度,R 会使其右转 90 度。这将使机器人返回其初始方向和位置。