这是力扣的一道简单题,但是比较锻炼思维。
题目大意:
机器人最初站在原点位置,给你一串指令,指导机器人移动,通过 L 和 R 来控制机器人的朝向,G 使得机器人向前移动一步。指令可以重复很多次,问最终机器人是否会在一个路线内循环走?会循环的话返回true , 不会循环的话返回false。
思路:
首先的思路就是,如何判断是否进入循环?一个直观的感受就是,机器人目前所在的位置是走过的,并且方向也是但是走过时的朝向。
思路的方向是对的,但是还有瑕疵。比如说,GGLGGLGGLGGLG , 在指令执行第一遍的时候,这个位置是走过的,并且方向也同样是向北,但是这样的指令每次执行之后机器人的位置都会向北移动一个,是false。
因此,我们之前的想法不够完善。
当指令执行完,若当前位置的朝向是北的时候,刚才我已经举了个反例,这样会导致每次向上移动一格,false;
那方向不是北而是其他方向的时候,机器人是会经过有限次重复指令回到原点的。比如朝向是南,那就是说执行一次会移动到那个位置并方向相反,当再执行一遍指令,就会移动到远点且方向是朝北。
这里举个例子可以自己试一下,GLGLGLGLGGLGGLGG.
那同理,朝向是西和东的时候,原理和南是一样的,只不过这里需要循环四次指令才会回到原点。
当然,还有一个特殊的例子,就是如果执行完指令后,机器人在原点,那无论朝向如何,他都会一直在原点。这个特例很好想,极端情况就是指令中都是L和R,在原点转圈不移动。
代码:
class Solution {
public:
bool isRobotBounded(string instructions) {
int f = 1;
int l = 110;
int r = 110;
int flag = 0;
for(int i = 0 ; i < instructions.size() ; i++){
if(instructions[i] == 'G'){
if(f == 1)
l++;
if(f == 2)
r++;
if(f == 3)
l--;
if(f == 4)
r--;
}
if(instructions[i] == 'L'){
if(f == 1)
f = 4;
else if(f == 2)
f = 1;
else if(f == 3)
f = 2;
else if(f == 4)
f = 3;
}
if(instructions[i] == 'R'){
if(f == 1)
f = 2;
else if(f == 2)
f = 3;
else if(f == 3)
f = 4;
else if(f == 4)
f = 1;
}
}
if((l != 110 || r != 110) && f == 1)
return false;
else
return true;
}
};