在无限的平面上,机器人最初位于 (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. 困于环中的机器人。
经过一串指令后,如果在原点,或者不同方向,那么重复执行指令,必能回到原点。
掌握了这个规律,代码非常容易实现。
代码用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 }
}
}
执行结果如下: