LeetCode·每日一题·1041. 困于环中的机器人·模拟

作者:小迅
链接:https://leetcode.cn/problems/robot-bounded-in-circle/solutions/2219950/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-dj3a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目LeetCode·每日一题·1041. 困于环中的机器人·模拟_第1张图片

 

示例LeetCode·每日一题·1041. 困于环中的机器人·模拟_第2张图片

 

思路

题意 -> 给定一个字符串,按照字符串重复进行模拟,返回机器人是否能回到原点

由于机器人在重复的指向字符串的指令,判断能否回到原点,可以按照指令模拟机器人的行动路线,根据最后落点位置判断是否能回到原点。 落点分为两种情况:

  • 落点在原点:
    • 这个就很好判断,由于执行完一次落点就在原点,那么之后重复执行肯定也还是会在原点,不管出发方向都会在原点(这里不理解可以直接模拟一下)
  • 落点不在原点:
    • 如果方向向北的话,会一直慢慢往前移
    • 如果方向不是向北的话,在之后的重复中,方向会一直旋转,最后回到原点。

先忽略位移,只考虑旋转,由于旋转基元是90°,所以每次instruction导致的角位移一定是90°的生成旋转群元素之一,这显然是个四阶群,所以群中每个元素的四次幂一定是他的自身,说人话就是做四遍instruction一定会脸朝北。所以只要模拟一次看看位置是不是在原地就行或者方向是不是向北。

代码注释超级详细

代码



bool isRobotBounded(char * instructions){
    int dirx[] = {0, 1, 0, -1};
    int diry[] = {1, 0, -1, 0};
    int len = strlen(instructions);
    int x = 0, y = 0;
    int d = 0;//初始化变量,x,y记录位置,d记录方向,dirx记录方向对于的x,y变化
    for (int i = 0; i < len; ++i) {//枚举每一个位置
        switch(instructions[i]) {//判断当前位置动作
        case 'G':
        {
            x += dirx[d];//前进
            y += diry[d];
            break;
        }
        case 'L'://转向
        {
            d += 4;//防止负数
            --d;//0--北,1--东,2--南,3--西
            d %= 4;
            break;
        }
        case 'R':
        {
            ++d;
            d %= 4;
            break;
        }
        }
    }
    return d != 0 || (x == 0 && y == 0);
}

作者:小迅
链接:https://leetcode.cn/problems/robot-bounded-in-circle/solutions/2219950/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-dj3a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(LeetCode刷题笔记,leetcode,算法,职场和发展)