机器人返回起点最小指令数算法面试问题求助
问题分析与解决方案
首先,我们需要明确机器人的核心状态:执行指令后的最终坐标和最终朝向,这是计算返回起点最少指令数的基础。以下是分场景的具体解法:
步骤1:预处理与状态模拟
先过滤输入字符串中的非大写F/L/R字符,然后模拟机器人移动,得到两个关键状态:
- 最终坐标
(final_x, final_y)(初始为(0,0)) - 最终朝向
final_dir(用0-3表示四个方向:0=北,1=东,2=南,3=西)
模拟规则:
F:根据当前朝向更新坐标:北→y+1,东→x+1,南→y-1,西→x-1L:左转90度,final_dir = (final_dir - 1) % 4R:右转90度,final_dir = (final_dir + 1) % 4
步骤2:分场景计算最少指令数
场景1:已在起点
如果final_x == 0且final_y == 0,直接返回0。
场景2:单方向位移(需抵消的位移仅在x或y轴上)
当required_dx = -final_x和required_dy = -final_y中有一个为0时,说明只需朝单一方向移动即可回到起点:
- 确定目标朝向
target_dir:required_dx > 0→东(1);required_dx < 0→西(3)required_dy > 0→北(0);required_dy < 0→南(2)
- 计算从
final_dir到target_dir的最少转向次数:diff = (target_dir - final_dir) % 4 turns = min(diff, 4 - diff) - 总指令数 = 转向次数 + 需移动的步数(
abs(required_dx) + abs(required_dy))
示例验证:输入"RF"
- 模拟后状态:
final_x=1, final_y=0, final_dir=1 required_dx=-1,目标朝向为西(3)- 转向次数:
min((3-1)%4,4-2)=2,步数1,总指令数2+1=3,符合示例输出。
场景3:双方向位移(需抵消的位移同时在x和y轴上)
当required_dx和required_dy均不为0时,需分两种移动顺序计算,取最小值:
顺序1:先处理x方向,再处理y方向
- 计算从
final_dir转到x方向目标朝向的最少转向次数t1 - 加上x方向步数
abs(required_dx) - 从x方向转向到y方向(垂直方向,最少1步转向),加上y方向步数
abs(required_dy)
总次数:t1 + abs(required_dx) + 1 + abs(required_dy)
顺序2:先处理y方向,再处理x方向
- 计算从
final_dir转到y方向目标朝向的最少转向次数t1' - 加上y方向步数
abs(required_dy) - 从y方向转向到x方向(最少1步转向),加上x方向步数
abs(required_dx)
总次数:t1' + abs(required_dy) + 1 + abs(required_dx)
最终取两种顺序的最小值。
完整流程总结
- 过滤无效指令,模拟得到最终坐标和朝向
- 若已在起点,返回0
- 计算需抵消的位移
required_dx、required_dy - 单方向位移:计算转向次数+步数
- 双方向位移:计算两种顺序的总指令数,取最小值
内容的提问来源于stack exchange,提问作者tryingmybestlol98
相关产品推荐
相关产品推荐

