LeetCode第874题解析
机器人在一个无限大小的网格上行走,从点 (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) 处
提示:
- 0 <= commands.length <= 10000
- 0 <= obstacles.length <= 10000
- -30000 <= obstacle[i][0] <= 30000
- -30000 <= obstacle[i][1] <= 30000
- 答案保证小于 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题解析相关推荐
- LeetCode第78题解析
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [[3],[1],[2],[1,2, ...
- LeetCode第111题解析
给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15,7], ...
- 【持续更新】Leetcode SQL题目全解析(附建表sql)
Leetcode SQL题目全解析 越前须知(雾) 题目Q & A 175 组合两个表 181 超过经理收入的员工 182 查找重复电子邮箱 183 从不订购的用户 197 上升的温度 511 ...
- 这是一份用心整理的Android面试总结,面试真题解析
在GitHub找到大神整理的一份学习Android非常好的资料,分享给大家. 知识点详细清单 总是很多人在谈做Android如何艰难,大环境差,坑位少,工资低,裁员多. 其实哪有什么互联网寒冬?只是你 ...
- 安卓手机游戏开发培训!万字长文轻松彻底入门Flutter,面试真题解析
在GitHub找到大神整理的一份学习Android非常好的资料,分享给大家. 题库非常全面包括: Android基础知识: 基本涵盖Android所有知识体系,四大组件,Fragment,WebVie ...
- 蓝桥杯第十二届真题解析
目录 前言 考试技巧 真题解析 第一题 (ASC) 第二题 (卡片) 第三题 (直线) 第四题 (货物摆放) 第五题 (路径) 第六题 (时间显示) 第七题 (最少砝码) 第八题 (杨辉三角形) 第九 ...
- 小程序FMP优化实录,已拿offer附真题解析
主要说一下个人经历,希望能给即将面试的小伙伴一些有效信息.大家都要加油~ 基本情况 先说一下个人基本情况,计算机科学与技术专业.主要学的Android开发,所以投的岗位都是Android开发工程师.投 ...
- c语言最长递增子序列nlogn,十月常见算法考题、最长递增子序列,Leetcode第300题最长上升子...
十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子 十月常见算法考题.最长递增子序列,Leetcode第300题最长上升子序列的变种,我没见过乔丹,今天詹姆斯就是我的神! @Aut ...
- leetcode分类刷题笔记
leetcode分类刷题笔记--基于python3 写在前面 1.做题如果实在想不出时间复杂度比较优的解法,可以先写出暴力解法,尝试在其基础上优化 2.排序.双指针.二分等--经常可以优化时间复杂度 ...
最新文章
- P4048 [JSOI2010]冷冻波
- android实现跑马灯效果(最小集代码)
- 时间同步引起的oracle故障二
- Mina2中IoService
- Socket accept failed
- 闲谈“个人核心竞争力”与“危机感” !!!
- python 内置方法赋值_Python内置数据结构之字符串str
- django如何连接mysql_Django如何连接mysql
- 通过saltapi接口安装实例(modules)
- 启动优化之Android-Startup
- chart 控件 画线总是首尾相连
- 详解文本格式(Text)[第二天]
- 弹力弹珠java_Java趣味小程序:打弹珠
- CVPR21-无监督异常检测《CutPaste:Self-Supervised Learning for Anomaly Detection and Localization》
- spanning-tree Protocol 简称STP,生成树协议,被广泛部署在二层交换网络中,用于防止网络出现环路,同时增加网络的冗余性
- 离散数学笔记(一)【集合、命题逻辑 、谓词逻辑】
- 新媒体时代的公关怎么做
- Vue.js学习笔记—shop-bus:实战:利用计算属性、指令等知识开发购物车
- 磁珠的作用以及和电感的区别
- app.json: 未找到 [“pages“][2] 对应的 pages/goods_list/index.wxml 文件的问题解决办法
热门文章
- MOOC翁恺老师零基础学Java语言课程编程题——第六周
- 计算机的基础操作知识试题,[计算机基本操作知识]计算机操作系统基础知识试题...
- Couldn’t load custom C++ ops.
- LabVIEW网络服务安全2
- MySQL高性能和高可用方案
- python如何输入n个数字_如何在列表中逐个输入n个数字?
- 2023年Node.js全网详细下载安装的最新教程
- lambda表达式无法抛出异常_Lambda 异常处理
- java人民币大小写转换_Java 实现人民币小写转大写[转载http://sunjun.blogchina.com/]
- PS不能存储,因为程序错误