ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
**问题描述** 有一个机器人,给一串指令,L 左转 R 右转,F 前进一步,B 后退一步,问最后机器人的坐标,最开始,机器人位于 0 0,方向为正 Y。 可以输入重复指令 n : 比如 R2(LF) 这个等于指令 RLFLF。 问最后机器人的坐标是多少? **解题思路** 这里的一个难点是解析重复指令。主要指令解析成功,计算坐标就简单了。 **源码参考** ~~~ package main import ( "unicode" ) const ( Left = iota Top Right Bottom ) func main() { println(move("R2(LF)", 0, 0, Top)) } func move(cmd string, x0 int, y0 int, z0 int) (x, y, z int) { x, y, z = x0, y0, z0 repeat := 0 repeatCmd := "" for _, s := range cmd { switch { case unicode.IsNumber(s): repeat = repeat*10 + (int(s) - '0') case s == ')': for i := 0; i < repeat; i++ { x, y, z = move(repeatCmd, x, y, z) } repeat = 0 repeatCmd = "" case repeat > 0 && s != '(' && s != ')': repeatCmd = repeatCmd + string(s) case s == 'L': z = (z + 1) % 4 case s == 'R': z = (z - 1 + 4) % 4 case s == 'F': switch { case z == Left || z == Right: x = x - z + 1 case z == Top || z == Bottom: y = y - z + 2 } case s == 'B': switch { case z == Left || z == Right: x = x + z - 1 case z == Top || z == Bottom: y = y + z - 2 } } } return } ~~~ **源码解析** 这里使用三个值表示机器人当前的状况,分别是:x 表示 x 坐标,y 表示 y 坐标,z 表示当前方向。 L、R 命令会改变值 z,F、B 命令会改变值 x、y。 值 x、y 的改变还受当前的 z 值影响。 如果是重复指令,那么将重复次数和重复的指令存起来递归调用即可。