1041. 困于环中的机器人

这是力扣的一道简单题,但是比较锻炼思维。

题目大意:
机器人最初站在原点位置,给你一串指令,指导机器人移动,通过 L 和 R 来控制机器人的朝向,G 使得机器人向前移动一步。指令可以重复很多次,问最终机器人是否会在一个路线内循环走?会循环的话返回true , 不会循环的话返回false。

思路:
首先的思路就是,如何判断是否进入循环?一个直观的感受就是,机器人目前所在的位置是走过的,并且方向也是但是走过时的朝向。

思路的方向是对的,但是还有瑕疵。比如说,GGLGGLGGLGGLG , 在指令执行第一遍的时候,这个位置是走过的,并且方向也同样是向北,但是这样的指令每次执行之后机器人的位置都会向北移动一个,是false。

因此,我们之前的想法不够完善。

当指令执行完,若当前位置的朝向是北的时候,刚才我已经举了个反例,这样会导致每次向上移动一格,false;
那方向不是北而是其他方向的时候,机器人是会经过有限次重复指令回到原点的。比如朝向是南,那就是说执行一次会移动到那个位置并方向相反,当再执行一遍指令,就会移动到远点且方向是朝北。
这里举个例子可以自己试一下,GLGLGLGLGGLGGLGG.

那同理,朝向是西和东的时候,原理和南是一样的,只不过这里需要循环四次指令才会回到原点。

当然,还有一个特殊的例子,就是如果执行完指令后,机器人在原点,那无论朝向如何,他都会一直在原点。这个特例很好想,极端情况就是指令中都是L和R,在原点转圈不移动。

代码:

class Solution {
public:
    bool isRobotBounded(string instructions) {
        int f = 1;
        int l = 110;
        int r = 110;
        int flag = 0;
        for(int i = 0 ; i < instructions.size() ; i++){
            if(instructions[i] == 'G'){
                if(f == 1)
                    l++;
                if(f == 2)
                    r++;
                if(f == 3)
                    l--;
                if(f == 4)
                    r--;
            }
            if(instructions[i] == 'L'){
                if(f == 1)
                    f = 4;
                else if(f == 2)
                    f = 1;
                else if(f == 3)
                    f = 2;
                else if(f == 4)
                    f = 3;
            }
            if(instructions[i] == 'R'){
                if(f == 1)
                    f = 2;
                else if(f == 2)
                    f = 3;
                else if(f == 3)
                    f = 4;
                else if(f == 4)
                    f = 1;
            }
        }
        if((l != 110 || r != 110) && f == 1)
            return false;
        else    
            return true;
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值