每日一题:困于环中的机器人
题目链接:https://leetcode.cn/problems/robot-bounded-in-circle/
# 解题思路
此题具有轮回性,只要重复执行四次指令串后能回到 (0,0),则一定会在转圈圈。
特殊的,如果指令串本身就是一个转圈圈的指令,就无须再循环执行指令串
# 提交结果
# 代码
class Solution { | |
public boolean isRobotBounded(String instructions) { | |
/** | |
* 方向枚举: | |
* 0 - 向北 | |
* 1 - 向东 | |
* 2 - 向南 | |
* 3 - 向西 | |
* | |
* L 表示 -1,R 表示 +1 | |
* | |
* 当前方向 = (4 + 前一方向 + L|R) % 4 | |
* | |
* 如果存在循环,一定会在四个轮回中回到某个位置,否则,就不会被困在环中 | |
*/ | |
char[] chs = instructions.toCharArray(); | |
int n = chs.length; | |
//pos [0], pos [1] 表示坐标,d 表示方向 | |
int[] pos = new int[2]; | |
int d = 0; | |
for (int round = 1; round < 5; ++round) { | |
for (int i = 0; i < n; ++i) { | |
if (chs[i] == 'L' || chs[i] == 'R') { | |
// 调整方向 | |
d = (d + 4 + (chs[i] == 'R' ? 1 : -1)) % 4; | |
} else { | |
// 直走一步 | |
move(pos, d); | |
} | |
} | |
// 回到了起点,直接返回 | |
if (pos[0] == 0 && pos[1] == 0) return true; | |
} | |
return false; | |
} | |
private void move(int[] pos, int d) { | |
switch(d) { | |
case 0: | |
++pos[1]; | |
break; | |
case 1: | |
++pos[0]; | |
break; | |
case 2: | |
--pos[1]; | |
break; | |
case 3: | |
--pos[0]; | |
break; | |
default: | |
break; | |
} | |
} | |
} |