题目描述
- 平面内有一个机器人,有三种指令:
- G: 直走一格
- L: 左转90度
- R: 右转90度
- 给定一串指令,看机器人是否会在一定范围内转圈
示例
输入:instructions = "GGLLGG"
输出:true
解释:机器人最初在(0,0)处,面向北方。
“G”:移动一步。位置:(0,1)方向:北。
“G”:移动一步。位置:(0,2).方向:北。
“L”:逆时针旋转90度。位置:(0,2).方向:西。
“L”:逆时针旋转90度。位置:(0,2)方向:南。
“G”:移动一步。位置:(0,1)方向:南。
“G”:移动一步。位置:(0,0)方向:南。
重复指令,机器人进入循环:(0,0)——>(0,1)——>(0,2)——>(0,1)——>(0,0)。
在此基础上,我们返回true。
输入:instructions = "GG"
输出:false
解释:机器人最初在(0,0)处,面向北方。
“G”:移动一步。位置:(0,1)方向:北。
“G”:移动一步。位置:(0,2).方向:北。
重复这些指示,继续朝北前进,不会进入循环。
在此基础上,返回false。
题解
- 思路:模拟 + 分类讨论
- 第一直觉是哈希表,但分类讨论后得到的结论写起来更方便
- 回到原点,必为“转圈”
- 一轮到达终点后
- 方向向上,必回不到原点
- 方向向左、右,必会回到原点
- 方向向下,必会回到原点
func isRobotBounded(instructions string) bool {x, y := 0, 0dx, dy := []int{-1, 0, 1, 0}, []int{0, 1, 0, -1}d := 0for i := range instructions {c := instructions[i]if c == 'G' {x += dx[d]y += dy[d]} else if c == 'L' {d = (d + 3) % 4} else {d = (d + 1) % 4}}return x == 0 && y == 0 || d > 0
}