机器人在一个无限大小的网格上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令:

  • -2:向左转 90 度
  • -1:向右转 90 度
  • 1 <= x <= 9:向前移动 x 个单位长度

在网格上有一些格子被视为障碍物。

第 i 个障碍物位于网格点  (obstacles[i][0], obstacles[i][1])

机器人无法走到障碍物上,它将会停留在障碍物的前一个网格方块上,但仍然可以继续该路线的其余部分。

返回从原点到机器人所有经过的路径点(坐标为整数)的最大欧式距离的平方。

示例 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. 0 <= commands.length <= 10000
  2. 0 <= obstacles.length <= 10000
  3. -30000 <= obstacle[i][0] <= 30000
  4. -30000 <= obstacle[i][1] <= 30000
  5. 答案保证小于 2 ^ 31

解题思路:

1.分解机器人行走

走k步,就是朝着一个方向走k个1步
怎么朝着某个方向走出一步

方向向北,机器人坐标点向上走一步
方向向东,机器人坐标点向右走一步
方向向南,机器人坐标点向下走一步
方向向西,机器人坐标点向上左一步

int direx[] = {0,1,0,-1};
int direy[] = {1,0,-1,0};
direx[],direy[] 要竖着对齐看- 向北,坐标轴上x不动,y+1, 即(0,1)- 向东,坐标轴上x+1,y不动, 即(1,0)- 向南,坐标轴上x不动,y-1, 即(0,-1)- 向西,坐标轴上x-1,y不动, 即(-1,0)

( direx[i], direy[i] ),加上当前坐标后为 (curx,cury) + ( direx[i], direy[i] )

2.机器人如何调整方向

direx[]direy[] 的下标 i 代表了当前机器人的方向

  • i=0,向北
  • i=1,向东
  • i=2,向南
  • i=3,向西

当读取到调整方向的指令时,如

"-1":“向右转90度”,只要当前方向curdire + 1就可以得到右转方向
"-2":“向左转90度”,只要当前方向curdire + 3 就可以得到左转方向 (curdire + 3) % 4,
因为不管curdire当前是哪个方向,左转都在其左边,在direx数组的定义中顺势针数3个就是其左边,所以就是加3

3.怎么判断是否遇到了障碍物

障碍物有多个,所以需要有一个障碍物坐标点集合
机器人每试图走一个位置,就用此位置与障碍物集合列表里的坐标进行比较,看是否刚好是障碍物坐标点

不是,则“真正走到这个点”,更新机器人坐标点(curx,cury)
是障碍物,那么不走下一步,停留在当前,执行下一条命令

class Solution {
public:int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {//方向向量int direx[] = {0, 1, 0, -1};int direy[] = {1, 0, -1, 0};//记录机器人的现在坐标int curx = 0, cury = 0;//记录现在的方向int curdire = 0;int comLen = commands.size();//保存结果int ans = 0;//用set记录障碍物的位置set<pair<int,int>> obstacleSet;for(int i = 0; i < obstacles.size(); ++i) {obstacleSet.insert(make_pair(obstacles[i][0], obstacles[i][1]));}for(int i = 0; i < comLen; ++i) {//如果是-2,向左转90度,取模是为了防止超出数组下标if(commands[i] == -2) {curdire = (curdire + 3) % 4;}//如果是-1,向右转90度else if(commands[i] == -1) {curdire = (curdire + 1) % 4;}else {for(int j = 0; j < commands[i]; ++j) {//机器人尝试向前走一步,并判断是否会遇到障碍物int nx = curx + direx[curdire];int ny = cury + direy[curdire];if(obstacleSet.find(make_pair(nx, ny)) == obstacleSet.end()) {curx = nx;cury = ny;ans = max(ans, curx * curx + cury * cury);}else {break;}}}}return ans;}
};

LeetCode第874题解析相关推荐

  1. LeetCode第78题解析

    给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [[3],[1],[2],[1,2, ...

  2. LeetCode第111题解析

    给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15,7], ...

  3. 【持续更新】Leetcode SQL题目全解析(附建表sql)

    Leetcode SQL题目全解析 越前须知(雾) 题目Q & A 175 组合两个表 181 超过经理收入的员工 182 查找重复电子邮箱 183 从不订购的用户 197 上升的温度 511 ...

  4. 这是一份用心整理的Android面试总结,面试真题解析

    在GitHub找到大神整理的一份学习Android非常好的资料,分享给大家. 知识点详细清单 总是很多人在谈做Android如何艰难,大环境差,坑位少,工资低,裁员多. 其实哪有什么互联网寒冬?只是你 ...

  5. 安卓手机游戏开发培训!万字长文轻松彻底入门Flutter,面试真题解析

    在GitHub找到大神整理的一份学习Android非常好的资料,分享给大家. 题库非常全面包括: Android基础知识: 基本涵盖Android所有知识体系,四大组件,Fragment,WebVie ...

  6. 蓝桥杯第十二届真题解析

    目录 前言 考试技巧 真题解析 第一题 (ASC) 第二题 (卡片) 第三题 (直线) 第四题 (货物摆放) 第五题 (路径) 第六题 (时间显示) 第七题 (最少砝码) 第八题 (杨辉三角形) 第九 ...

  7. 小程序FMP优化实录,已拿offer附真题解析

    主要说一下个人经历,希望能给即将面试的小伙伴一些有效信息.大家都要加油~ 基本情况 先说一下个人基本情况,计算机科学与技术专业.主要学的Android开发,所以投的岗位都是Android开发工程师.投 ...

  8. c语言最长递增子序列nlogn,十月常见算法考题、最长递增子序列,Leetcode第300题最长上升子...

    十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子 十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子序列的变种,我没见过乔丹,今天詹姆斯就是我的神! @Aut ...

  9. leetcode分类刷题笔记

    leetcode分类刷题笔记--基于python3 写在前面 1.做题如果实在想不出时间复杂度比较优的解法,可以先写出暴力解法,尝试在其基础上优化 2.排序.双指针.二分等--经常可以优化时间复杂度 ...

最新文章

  1. P4048 [JSOI2010]冷冻波
  2. android实现跑马灯效果(最小集代码)
  3. 时间同步引起的oracle故障二
  4. Mina2中IoService
  5. Socket accept failed
  6. 闲谈“个人核心竞争力”与“危机感” !!!
  7. python 内置方法赋值_Python内置数据结构之字符串str
  8. django如何连接mysql_Django如何连接mysql
  9. 通过saltapi接口安装实例(modules)
  10. 启动优化之Android-Startup
  11. chart 控件 画线总是首尾相连
  12. 详解文本格式(Text)[第二天]
  13. 弹力弹珠java_Java趣味小程序:打弹珠
  14. CVPR21-无监督异常检测《CutPaste:Self-Supervised Learning for Anomaly Detection and Localization》
  15. spanning-tree Protocol 简称STP,生成树协议,被广泛部署在二层交换网络中,用于防止网络出现环路,同时增加网络的冗余性
  16. 离散数学笔记(一)【集合、命题逻辑 、谓词逻辑】
  17. 新媒体时代的公关怎么做
  18. Vue.js学习笔记—shop-bus:实战:利用计算属性、指令等知识开发购物车
  19. 磁珠的作用以及和电感的区别
  20. app.json: 未找到 [“pages“][2] 对应的 pages/goods_list/index.wxml 文件的问题解决办法

热门文章

  1. MOOC翁恺老师零基础学Java语言课程编程题——第六周
  2. 计算机的基础操作知识试题,[计算机基本操作知识]计算机操作系统基础知识试题...
  3. Couldn’t load custom C++ ops.
  4. LabVIEW网络服务安全2
  5. MySQL高性能和高可用方案
  6. python如何输入n个数字_如何在列表中逐个输入n个数字?
  7. 2023年Node.js全网详细下载安装的最新教程
  8. lambda表达式无法抛出异常_Lambda 异常处理
  9. java人民币大小写转换_Java 实现人民币小写转大写[转载http://sunjun.blogchina.com/]
  10. PS不能存储,因为程序错误