在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意:
北方向 是y轴的正方向。
南方向 是y轴的负方向。
东方向 是x轴的正方向。
西方向 是x轴的负方向。
机器人可以接受下列三条指令之一:
“G”:直走 1 个单位
“L”:左转 90 度
“R”:右转 90 度
机器人按顺序执行指令 instructions,并一直重复它们。
只有在平面中存在环使得机器人永远无法离开时,返回 true。否则,返回 false。
解题思路: 每次执行完代码后会有两种情况
1、移动后的位置相对于原位置没有发生改变,那么机器人将永远无法离开
2、移动后的位置发生了改变
- 移动后的方向还是指向北方——这种情况机器人将会逃逸每次循环会相对于北方移动相同的距离
- 移动后的方向指向了其他地方——这种情况机器人将会困于循环。举个例子如果每次执行代码后方向会向左改变90°。假设第一次机器人移动的位置是(x,y),那么第二次移动的位置就会是(-y,x),第三次(-x,-y),第四次(y,-x)。执行四次之后位置还是(0,0),方向也变回了北方。
function isRobotBounded(instructions: string): boolean {
const angleToPath = new Map([
[0, [1, 0]],
[90, [0, 1]],
[180, [-1, 0]],
[270, [0, -1]],
[-90, [0, -1]],
[-180, [-1, 0]],
[-270, [0, 1]]
]);
let initAngle = 90,
postion = [0, 0],
index = 0;
while (index < instructions.length) {
const action = instructions[index];
switch (action) {
case 'G':
const path = angleToPath.get(initAngle % 360);
postion[0] += path[0];
postion[1] += path[1];
break;
case 'L':
initAngle += 90;
break;
case 'R':
initAngle -= 90;
break;
default:
break;
}
index++;
}
if(postion[0] == 0 && postion[1] == 0){
return true;
}else{
if(initAngle % 360 !== 90 && initAngle % 360 !== -270){
return true;
}
}
return false
};