题解使用了模拟的思路。我们可以假设没有北面的墙壁,无限延长东西两面镜子的长度,光线会通过东西两面镜子的反射一直往北走,每次增加的纵向距离为 q。当光线走过的纵向距离为 p 的整数倍时,光线到达某个接收器。题解中使用了 left 和 upward 两个布尔变量分别表示光线当前是向左运动还是向右运动,以及是向上运动还是向下运动。通过模拟光线的运动过程,当光线到达北面或南面的墙壁时,根据光线的运动方向和位置来判断遇到了哪个接收器。
时间复杂度: O(p)
空间复杂度: O(1)
class Solution:
def mirrorReflection(self, p: int, q: int) -> int:
left = True # 表示光线当前是否向左运动
upward = True # 表示光线当前是否向上运动
y = 0 # 光线当前的纵坐标
while(True):
if y == p: # 光线到达北面或南面的墙壁
if not upward: # 光线向下运动
return(0) # 光线遇到接收器 0
if left: # 光线向左运动
return(2) # 光线遇到接收器 2
return(1) # 光线遇到接收器 1
if y > p: # 光线超出了北面墙壁
y %= p # 光线从南面墙壁射入
upward = not upward # 光线改变运动方向
else:
y += q # 光线向北运动 q 的距离
left = not left # 光线改变运动方向