lc1041-困于环中的机器人

题目描述

  • 平面内有一个机器人,有三种指令:
    1. G: 直走一格
    2. L: 左转90度
    3. 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, 0
    dx, dy := []int{-1, 0, 1, 0}, []int{0, 1, 0, -1}
    d := 0

    for 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
}
posted @ 2025-09-30 20:18  余越  阅读(10)  评论(0)    收藏  举报