困于环中的机器人
2025-08-23
题目描述
LeetCode 题目: Robot Bounded In Circle
输入与输出
输入:instructions: str
一个会被无限重复执行的指令字符串。
1 <= instructions.length <= 100instructions[i]为'G'、'L'或'R'。
对于每条指令:
'G':将当前位置加上当前方向向量,使机器人前进一步。'L'和'R':将方向向量旋转 90 度。
输出:True/False
- True: 机器人被限制在一个圆内,最终会回到原点。
- False: 机器人会离原点无限远。
判断机器人是否有界时,只需检查执行一轮指令之后的状态:
True(有界):
final_pos == (0, 0)
或者:
final_dir != initial_dir- 机器人只能朝向四个方向,因此只要一轮之后方向发生变化,就会在四轮之内形成闭合路径。
False(无界):
final_pos != (0, 0)且final_dir == initial_dir
分析
为了判断 True/False,需要在二维空间中追踪:
- 机器人的位置。
- 机器人的方向。
方向的表示:
有两种选择:
- 更新角度 θ,再使用 (cosθ,sinθ)。
- 直接从四个单位向量中选择:(0,1)、(1,0)、(0,-1)、(-1,0)。
这里选择第二种方式求解。
解法
|
|
复杂度
- 时间: O(n),每条指令遍历一次。
- 空间: O(1),仅使用固定数量的变量保存位置和方向。
推广
这种方法可以推广到具有离散旋转和可变步长的更高维空间。
核心原理(任意维度):
- 有界条件:
final_position == origin或final_direction != initial_direction。 - 旋转约束:
- 二维: 简单角度,例如 90°、60°、45°,即 2π 的有理数倍。
- 三维: 更复杂,涉及绕不同轴旋转和欧拉角。
- n 维: 更复杂,可能同时在多个平面旋转。
- 关键要求: 旋转必须构成有限群,也就是离散而非连续的旋转。
更高维度:
- 方向表示:
- 二维:单位向量
[dx, dy]。 - 三维:单位向量
[dx, dy, dz]。 - n 维:
[d1, d2, ..., dn],满足d1² + d2² + ... + dn² = 1。
- 二维:单位向量
- 旋转: n×n 正交矩阵。
- 在二维解法中,虽然使用了简单的坐标变换规律来求新的 (x,y),但本质上这是绕原点旋转的问题,可以用线性代数解释:
1 2 3 4 5 6 7 8 9 10 11# General rotation matrix for angle θ (counterclockwise): ⎡cos(θ) -sin(θ)⎤ ⎡x⎤ ⎡x·cos(θ) - y·sin(θ)⎤ ⎣sin(θ) cos(θ)⎦ ⎣y⎦ = ⎣x·sin(θ) + y·cos(θ)⎦ # For θ = 90° (Left turn): cos(90°)=0, sin(90°)=1 ⎡0 -1⎤ ⎡x⎤ ⎡-y⎤ ⎣1 0⎦ ⎣y⎦ = ⎣ x⎦ # For θ = -90° (Right turn): cos(-90°)=0, sin(-90°)=-1 ⎡ 0 1⎤ ⎡x⎤ ⎡ y⎤ ⎣-1 0⎦ ⎣y⎦ = ⎣-x⎦
- 在二维解法中,虽然使用了简单的坐标变换规律来求新的 (x,y),但本质上这是绕原点旋转的问题,可以用线性代数解释:
- 相同逻辑: 如果一轮之后方向发生变化,机器人会在有限步内形成闭合路径。
可变步长:
- 将
pos += direction * 1替换为pos += direction * step_length。
三维扩展:可变步长与绕 X/Y/Z 轴旋转:
|
|
关键结论: 在具有离散旋转的任意维度中,无论步长如何变化,基本的有界条件都相同。