每日一题之困于环中的机器人

在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意:
北方向 是y轴的正方向。
南方向 是y轴的负方向。
东方向 是x轴的正方向。
西方向 是x轴的负方向。
机器人可以接受下列三条指令之一:
“G”:直走 1 个单位
“L”:左转 90 度
“R”:右转 90 度
机器人按顺序执行指令 instructions,并一直重复它们。
只有在平面中存在环使得机器人永远无法离开时,返回 true。否则,返回 false。

解题思路: 每次执行完代码后会有两种情况

1、移动后的位置相对于原位置没有发生改变,那么机器人将永远无法离开
2、移动后的位置发生了改变
  • 移动后的方向还是指向北方——这种情况机器人将会逃逸每次循环会相对于北方移动相同的距离
  • 移动后的方向指向了其他地方——这种情况机器人将会困于循环。举个例子如果每次执行代码后方向会向左改变90°。假设第一次机器人移动的位置是(x,y),那么第二次移动的位置就会是(-y,x),第三次(-x,-y),第四次(y,-x)。执行四次之后位置还是(0,0),方向也变回了北方。
function isRobotBounded(instructions: string): boolean {
    const angleToPath = new Map([
        [0, [1, 0]],
        [90, [0, 1]],
        [180, [-1, 0]],
        [270, [0, -1]],
        [-90, [0, -1]],
        [-180, [-1, 0]],
        [-270, [0, 1]]
    ]);
    let initAngle = 90,
        postion = [0, 0],
        index = 0;
     while (index < instructions.length) {
            const action = instructions[index];
            switch (action) {
                case 'G':
                    const path = angleToPath.get(initAngle % 360);
                    postion[0] += path[0];
                    postion[1] += path[1];
                    break;
                case 'L':
                    initAngle += 90;
                    break;
                case 'R':
                    initAngle -= 90;
                    break;
                default:
                    break;
            }
            index++;
        }
    if(postion[0] == 0 && postion[1] == 0){
        return true;
    }else{
        if(initAngle % 360 !== 90 && initAngle % 360 !== -270){
            return true;
        }
    }
    return false
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值