On an infinite plane, a robot initially stands at (0, 0)
and faces north. The robot can receive one of three instructions:
"G"
: go straight 1 unit;"L"
: turn 90 degrees to the left;"R"
: turn 90 degrees to the right.The robot performs the instructions
given in order, and repeats them forever.
Return true
if and only if there exists a circle in the plane such that the robot never leaves the circle.
Example 1:
Input: instructions = "GGLLGG" Output: true Explanation: The robot moves from (0,0) to (0,2), turns 180 degrees, and then returns to (0,0). When repeating these instructions, the robot remains in the circle of radius 2 centered at the origin.
Example 2:
Input: instructions = "GG" Output: false Explanation: The robot moves north indefinitely.
Example 3:
Input: instructions = "GL" Output: true Explanation: The robot moves from (0, 0) -> (0, 1) -> (-1, 1) -> (-1, 0) -> (0, 0) -> ...
Constraints:
1 <= instructions.length <= 100
instructions[i]
is 'G'
, 'L'
or, 'R'
.struct Solution;
impl Solution {
fn is_robot_bounded(instructions: String) -> bool {
let mut x = 0;
let mut y = 0;
let mut i = 0;
let d = [[1, 0], [0, 1], [-1, 0], [0, -1]];
for c in instructions.chars() {
match c {
'G' => {
x += d[i][0];
y += d[i][1];
}
'L' => {
i = (i + 1) % 3;
}
'R' => {
i = (i + 3) % 3;
}
_ => (),
}
}
x == 0 && y == 0 || i != 0
}
}
#[test]
fn test() {
assert_eq!(Solution::is_robot_bounded("GGLLGG".to_string()), true);
assert_eq!(Solution::is_robot_bounded("GG".to_string()), false);
assert_eq!(Solution::is_robot_bounded("GL".to_string()), true);
}