目录
题目链接:
题目论述:
在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意:
北方向 是y轴的正方向。
南方向 是y轴的负方向。
东方向 是x轴的正方向。
西方向 是x轴的负方向。
机器人可以接受下列三条指令之一:
"G":直走 1 个单位
"L":左转 90 度
"R":右转 90 度
机器人按顺序执行指令 instructions,并一直重复它们。
只有在平面中存在环使得机器人永远无法离开时,返回 true。否则,返回 false。
第一眼想法:
做不出来。。卡了,我还以为需要用哈希表去存储每次的坐标,然后再查找是否在之前有存储过,但看了题解实际上并不用,也就是对成环的条件不清晰。
重点:成环
1.若一条指令执行过后,机器人在原点,则能成环。
不在原点的情况,可设此时坐标位移为(x,y):
2.此时机器人面向北方,则说明机器人没有改变方向,无法成环。(第一次指令位移为(x,y),第二次则为(2x,2y),永远无法到达原点)
3.此时机器人面向南方,那么再执行一次指令时会回到原点。(第一次指令位移为(x,y),又因此时面向南方,则第二次指令位移会是(-x,-y),回到了原点)。
4.面向东、西两方,根据面向南方的情况进行分析,可以知道在每执行四次指令时会回到原点。
也就是说只有执行一次指令后不在原点且面向北方的情况会不成环。
代码如下:
class Solution {
public:
bool isRobotBounded(string instructions) {
vector<vector<int>> fangxiang{{0,1}, {1,0}, {0,-1}, {-1,0}}; //分别对应北东南西
int index = 0; //用来记录朝向
int x= 0, y = 0;
for (char i : instructions) {
if(i == 'G'){
x += fangxiang[index][0];
y += fangxiang[index][1];
}
else if(i=='L'){
index += 3; //左转90度面朝西
index %= 4; //控制在4的范围内
}
else {
index ++; //同理
index %= 4;
}
}
return index != 0 || (x == 0 && y == 0);
}
};
需要注意在写二维数组的时候,需要按顺时针或逆时针的方向遍历写出,我这里给出的是按顺时针。
顺逆时针决定了for循环中index的运算处理。