(略有改动)在一个无限的平面(一个x,y正向坐标轴)上,机器人最初位于坐标 (0, 0) 处,面朝北方(东西南北分别对应应右左下上)。机器人可以接收三个指令:
"G":表示前进一个单位
"L":表示相对于当前朝向向左转
"R":表示相对于当前朝向向右转
给你一个指令instructions(一个包含了G,R,L三个字母的字符串),现在将无限执行这个指令,请写出一个方法用来判断这个指令能否帮助机器人走出这个平面
对于无限执行的指令,我们首先要做的就是分析当一条指令结束后的结果,再无限重复这个过程,可以这样分析:
执行一次指令后,当机器人在原点时,不论面向哪里,最终都无法离开原点
执行一次指令后,机器人不在原点,但是此时要分析机器人朝向:
- 机器人面朝北时,当机器人再次执行指令,仍然会是面向北,而且机器人会逐渐远离原点
- 机器人面朝东(西)时,即右(左)转了 90°,这样的话每执行一次指令,都会旋转90°,这样的话第一次和第三次指令的方向就会相反,第二次和第四次的指令的方向就会相反,这样一来,每四次指令之后,机器人都会回到原点,而且此时方向朝北,机器人无法走出平面
- 机器人面朝南时,第二次执行指令就会返回原点而且朝向为北,机器人仍然无法离开平面
分析完机器人执行完一次指令后的结果,这题就比较明了了。我们可以使用变量x,y来记录机器人的位置,用一个二维数组来维护四个前进方向,具体代码如下:
class Solution {
public boolean isSinked(String instructions) {
int[][] direc = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int direcIndex = 0;
int x = 0, y = 0;
int n = instructions.length();
for (int idx = 0; idx < n; idx++) {
char instruction = instructions.charAt(idx);
if (instruction == 'G') {
x += direc[direcIndex][0];
y += direc[direcIndex][1];
} else if (instruction == 'L') {
direcIndex += 3;
direcIndex %= 4;
} else {
direcIndex++;
direcIndex %= 4;
}
}
return direcIndex == 0 && (x != 0 && y != 0);
}
}

Comments NOTHING