LeetCode 1041.困于环中的机器人

题目描述

在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意:

  • 北方向 是y轴的正方向。
  • 南方向 是y轴的负方向。
  • 东方向 是x轴的正方向。
  • 西方向 是x轴的负方向。

机器人可以接受下列三条指令之一:

  • “G”:直走 1 个单位
  • “L”:左转 90 度
  • “R”:右转 90 度

机器人按顺序执行指令 instructions,并一直重复它们。

只有在平面中存在环使得机器人永远无法离开时,返回 true。否则,返回 false。

示例 1:

输入:instructions = "GGLLGG"
输出:true
解释:机器人最初在(0,0)处,面向北方。
“G”:移动一步。位置:(0,1)方向:北。
“G”:移动一步。位置:(0,2).方向:北。
“L”:逆时针旋转90度。位置:(0,2).方向:西。
“L”:逆时针旋转90度。位置:(0,2)方向:南。
“G”:移动一步。位置:(0,1)方向:南。
“G”:移动一步。位置:(0,0)方向:南。
重复指令,机器人进入循环:(0,0)——>(0,1)——>(0,2)——>(0,1)——>(0,0)。
在此基础上,我们返回true

示例 2:

输入:instructions = "GG"
输出:false
解释:机器人最初在(0,0)处,面向北方。
“G”:移动一步。位置:(0,1)方向:北。
“G”:移动一步。位置:(0,2).方向:北。
重复这些指示,继续朝北前进,不会进入循环。
在此基础上,返回false

示例 3:

输入:instructions = "GL"
输出:true
解释:机器人最初在(0,0)处,面向北方。
“G”:移动一步。位置:(0,1)方向:北。
“L”:逆时针旋转90度。位置:(0,1).方向:西。
“G”:移动一步。位置:(- 1,1)方向:西。
“L”:逆时针旋转90度。位置:(- 1,1)方向:南。
“G”:移动一步。位置:(- 1,0)方向:南。
“L”:逆时针旋转90度。位置:(- 1,0)方向:东方。
“G”:移动一步。位置:(0,0)方向:东方。
“L”:逆时针旋转90度。位置:(0,0)方向:北。
重复指令,机器人进入循环:(0,0)——>(0,1)——>(- 1,1)——>(- 1,0)——>(0,0)。
在此基础上,我们返回true

提示:

  • 1 <= instructions.length <= 100
  • instructions[i] 仅包含 ‘G’, ‘L’, ‘R’

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/robot-bounded-in-circle

题目分析

显然模拟太麻烦了,最好从题目逻辑中找到规律。比如,没有任何转向时只会向一个方向走,肯定不符合条件。存在转向时,如果一直向同一个方向转,必然会转圈。因为题目所给的地图无限大,只要把握大方向就好了。经过分析不难得出,如果在一次指令中L和R的个数相同,机器人会转回原方向,经过若干次指令后朝同一个方向进行了若干次位移,不会进入循环。
或者L和R的个数之差为4的倍数,也会转回原方向,这种情况下要判断进行一组指令后机器人的位置是否和出发位置相同
还有一种特殊情况是转向次数不同但是全程没有移动,此时也会进入循环
所以需判断一次指令中L和R的个数和记录机器人的位置

class Solution {
public:
    bool isRobotBounded(string instructions) {
        int cntL=0;
        int cntR=0;
        int cntG=0;
        int len = instructions.length();
        int dx[4]={0,-1,0,1}; 
        int dy[4]={1,0,-1,0};
        int location[2]={0,0};
        for(int i=0;i<len;i++){
            if(instructions[i]=='L'){
                cntL++;
            }
            else if(instructions[i]=='R'){
                cntR++;
            }
            else{
                cntG++;
                int temp=(cntL-cntR)%4;
                if(temp<0) temp+=4; //防止指针越界
                location[0]+=dx[temp];
                location[1]+=dy[temp];
            }
        }
        if((cntL==cntR&&cntG) || ((cntL-cntR)%4==0&&(location[0]!=0||location[1]!=0))) return false;
        else return true;
    }
};

LeetCode 1041.困于环中的机器人_第1张图片
通过逻辑做题的效率很高,代价就是因为思路不严谨会漏考虑很多情况,牺牲一下提交的通过率…
LeetCode 1041.困于环中的机器人_第2张图片

总结

有一点心疼通过率,但自己确实有点面向样例编程了,思路的严谨性差很多

你可能感兴趣的:(LeetCode每日一题,leetcode,算法)