题解-困于环中的机器人-模拟与相关证明

思路

  • 对于机器人,如果走结束后方向仍在北方,且不在原点才会脱离圈,不然就会困在圈里
  • 因此只需要模拟即可

证明

  • 假设我们第一次位移结束之后之后机器人所在的坐标为(x,y)
  • 我们按照此时机器人面向的方向讨论
    • 此时面向北方的:下一次前进路线和上次一致,第二次前进之后是(2x,2y),以此类推因此只要x,y不全为0则不会回到原点
    • 此时面向南方: 考虑转换参考系,以面朝的方向为y正半轴,此时两个参考系实际上是180度旋转的,在新参考系下前进了(x,y),并转换了方向,在之前的参考系下,下一次的前进方向与这一次相反,也就是说下一次会移动(-x,-y)的位移,并且下次移动之后会转向北方:与没有动之前一致,进入循环
    • 面向东方:同理,不过是每次都是翻转了90度的方向则位移路径为 (0,0)->(x,y)->(x+y,y-x)->(x+y-x,y-x-y)->(x+y-x-y,y-x-y+x),又到0,且方向回到了北方
    • 面向西方同理
  • 也相当于一个向量乘同一个旋转矩阵和位移矩阵多次但是方向需要另外特判一下

实现思路

  • 用一组数字记录当前坐标
  • 方向只有四种,且每个方向前进的方式不同,所以我们可以用数组存储每一种前进方式,根据方向增加
  • 用一个单独的数字记录当前面向的方向
  • 按照操作,模拟前进方式
  • 判断

代码

class Solution {
public:
    bool isRobotBounded(string instructions) {
        vector<vector<int>> direction{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        int x=0,y=0,now_direction=0;
        for (char choice:instructions){
            switch(choice){
                case 'G':
                    x+=direction[now_direction][0];
                    y+=direction[now_direction][1];
                    break;
                case 'L':
                    now_direction-=1;
                    if (now_direction<0)
                        now_direction+=4;
                    break;
                case 'R':
                    now_direction+=1;
                    now_direction%=4;
                    break;
                default:
                    break;
            }
        } 
        return !((x!=0||y!=0)&&now_direction==0);
    }
};