2020-09-05 模拟行走机器人

一:题目描述

机器人在一个无限大小的网格上行走,从点 (0, 0) 处开始出发,面向北方。
该机器人可以接收以下三种类型的命令:
-2:向左转 90 度
-1:向右转 90 度
1 <= x <= 9:向前移动 x 个单位长度
在网格上有一些格子被视为障碍物。
第 i 个障碍物位于网格点  (obstacles[i][0], obstacles[i][1])
机器人无法走到障碍物上,它将会停留在障碍物的前一个网格方块上,但仍然可以继续该路线的其余部分。
返回从原点到机器人所有经过的路径点(坐标为整数)的最大欧式距离的平方。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/walking-robot-simulation

二:示例

示例 1:
输入: commands = [4,-1,3], obstacles = []
输出: 25
解释: 机器人将会到达 (3, 4)

示例2:
输入: commands = [4,-1,4,-2,4], obstacles = [[2,4]]
输出: 65
解释: 机器人在左转走到 (1, 8) 之前将被困在 (1, 4) 处

三:解题思路及总结

1:想当然取巧直接返回X*X+Y*Y.实际计算的是机器人最后坐标点的欧式距离平 
  方。因为机器人行走路径、方向会改变,所以还是要更新Max,比较当前 
 max,与前一个max.
 2:遇到障碍物会停留在前一个格子,计算下一个坐标点,如果是障碍物,则不跟新X,Y坐标点,否则更新X,Y坐标点
 var robotSim = function(commands, obstacles) {
    let x=0,y=0,dir=0,max=0;
    let dx = [0, 1, 0, -1]; //N,E,S,W
    let dy = [1, 0, -1, 0]; //N,E,S,W
    let obSet=new Set()   
    for (let ob of obstacles) {
        obSet.add(ob[0]+'#'+ob[1])
    }
    for (let com of commands) {
       switch(com){
          case -1:
          dir=(dir+1)%4
          break
          case -2:
          dir=(dir+3)%4
          break
          default:
          while(com--){
          let nextX=x+dx[dir]
          let nextY=y+dy[dir]           
          if (obSet.has(nextX+'#'+nextY)) {
                break //减少不必要计算
          }else {
                 x=nextX
                 y=nextY
                 max = Math.max(max, x*x + y*y)
               }
          } 
       }       
    }
    return max
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。