[LeetCode] 1041. Robot Bounded In Circle

题:https://leetcode.com/problems/robot-bounded-in-circle/

题目大意

给定一个机器人,初始位置为(0,0) ,初始方向 为 北,机器人执行一段指令 S。
S 由三种命令组成 ,“G” (直走)、“L”(左转 90度)、 “R”(右转 90度)。

求若执行 S 若干次(1次或多次),机器人的轨迹是否为一个圆。

思路

若执行 S 若干次,机器人的轨迹是一个圈。那么定有最小次数 使得 机器人的轨迹为 圈。
换句话说,若机器人的轨迹是一个圈,那么存在k, 使得重复 k 次 执行 S 后,机器人能回到原始状态,即 初始位置为(0,0) ,初始方向 为 北。

那么 k 是多少?我们从方向的角度来考虑。

每次执行 S 后,机器人的方向会较原方向转移一个角度。
若转移角度为0,那么执行 1 次 后,此时机器人的位置必须为(0,0)。否则,每次执行S后,机器人的位置必发生偏移且方向向北。
若转移角度为180,那么执行 2 次 后,此时机器人的位置必为(0,0)。否则,每2次执行S后,机器人的位置必发生偏移且方向向北。
同理 若转移角度为左或右 90度,那么执行 4 次 后,此时机器人的位置必为(0,0)。

因此 k<=4,即 我们 对 S 最多执行4次,若 4 次中,机器人能回到初始状态,那么机器人执行若干次指令S,机器人的轨迹为圈。

总结下, k 是 机器人只能左、右转动 90度 决定的。

class Solution {
    int[][] dirs = {{0,1},{1,0},{0,-1},{-1,0}};
    
    public boolean isRobotBounded(String instructions) {
        
        int[] curPos = {0,0};
        int dir = 0;
        int t = 4;
        while(t-->0){
            for(char c:instructions.toCharArray()){
                if(c == 'G'){
                    curPos[0] += dirs[dir][0];
                    curPos[1] += dirs[dir][1];
                }else if(c == 'R'){
                    dir = (dir+1)%4;
                }else{
                    dir = (dir-1 + 4)%4;
                }
            }
            if(curPos[0] == 0 && curPos[1] == 0 && dir == 0)
                return true;
        }
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值