2022-04-30:在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意: 北方向 是y轴的正方向。 南方向 是y轴的负方向。 东方向 是x轴的正方向。 西方向 是x轴的负方向。 机器人可以接受下列三条指令之一: "G":直走 1 个单位 "L":左转 90 度 "R":右转 90 度 机器人按顺序执行指令 instructions,并一直重复它们。 只有在平面中存在环使得机器人永远无法离开时,返回 true。否则,返回 false。 输入: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。 力扣1041. 困于环中的机器人。

答案2022-04-30:

经过一串指令后,如果在原点,或者不同方向,那么重复执行指令,必能回到原点。 掌握了这个规律,代码非常容易实现。

代码用rust编写。代码如下:

fn main() {
    let ans = is_robot_bounded("GGLLGG");
    println!("ans = {}", ans);
}

fn is_robot_bounded(ins: &str) -> bool {
    let mut r: isize = 0;
    let mut c: isize = 0;
    let mut direction: isize = 0; // 0 1 2 3
    let str = ins.chars();
    for cur in str {
        if cur == 'R' {
            direction = right(direction);
        } else if cur == 'L' {
            direction = left(direction);
        } else {
            r = row(direction, r);
            c = col(direction, c);
        }
    }
    return r == 0 && c == 0 || direction != 0;
}

fn left(direction: isize) -> isize {
    if direction == 0 {
        3
    } else {
        direction - 1
    }
}

fn right(direction: isize) -> isize {
    if direction == 3 {
        0
    } else {
        direction + 1
    }
}

fn row(direction: isize, r: isize) -> isize {
    if direction == 1 || direction == 3 {
        r
    } else {
        r + if direction == 0 { 1 } else { -1 }
    }
}

fn col(direction: isize, c: isize) -> isize {
    if direction == 0 || direction == 2 {
        c
    } else {
        c + if direction == 1 { 1 } else { -1 }
    }
}

执行结果如下:

在这里插入图片描述


左神java代码