每日一题:困于环中的机器人
题目链接: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;  | |
        } | |
    } | |
} |