1. 问题描述:

力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种:
U: 向y轴正方向移动一格
R: 向x轴正方向移动一格。

不幸的是,在 xy 平面上还有一些障碍物,他们的坐标用obstacles表示。机器人一旦碰到障碍物就会被损毁。给定终点坐标(x, y),返回机器人能否完好地到达终点。如果能,返回true;否则返回false。

示例 1:

输入:command = "URR", obstacles = [], x = 3, y = 2
输出:true
解释:U(0, 1) -> R(1, 1) -> R(2, 1) -> U(2, 2) -> R(3, 2)。

示例 2:

输入:command = "URR", obstacles = [[2, 2]], x = 3, y = 2
输出:false
解释:机器人在到达终点前会碰到(2, 2)的障碍物。

示例 3:

输入:command = "URR", obstacles = [[4, 2]], x = 3, y = 2
输出:true
解释:到达终点后,再碰到障碍物也不影响返回结果。

限制:

2 <= command的长度 <= 1000
command由U,R构成,且至少有一个U,至少有一个R
0 <= x <= 1e9, 0 <= y <= 1e9
0 <= obstacles的长度 <= 1000
obstacles[i]不为原点或者终点

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

2. 思路分析:

① 首先最容易想到的是模拟机器人运动过程的做法,运动过程中判断当前的位置是否碰到了障碍物,如果碰到了障碍物那么直接return False,没有则继续移动但是很遗憾,模拟运动轨迹的做法提交上去超时了,题目的测试用例中有一些非常大的数据所以会超时

② 除了使用模拟的方法之外,还可以这样想,因为每一次都是都是使用同样的指令进行移动,所以我们可以计算从位置(0, 0)出发一直到目标位置可以经过多少个循环到达目标位置(x, y)的最近位置,也就是不超过(x, y)的最近位置,经过这样计算的话说明我可以通过这样多次的周期运动到达(x1, y1)位置,下一次还是这样运动(不满一个周期),所以实际上是相当于是判断第一次机器人的运动轨迹是否可以到达目标位置,所以最终转化为第一次的运动轨迹是否存在(x0, y0)坐标能够到达目标位置。具体的做法是我们需要记录下第一次的运动的轨迹,也就是每一次运动的(x0, y0)坐标,因为使用的是python语言所以使用字典记录这些位置即可,字典的键为元组类型,可以表示(x,y)位置。我们可以计算出第一次运动之后的坐标,这个坐标表示一个周期,然后通过计算多少个周期将目标位置(x, y)映射到第一次运动的轨迹中最终判断映射到第一次运动轨迹的字典中是否有这个坐标如果存在说明是可以从(0, 0)这个位置到达(x,y)位置的

③ 第二步是判断在运动过程中是否会碰到障碍物,其实与判断是否可以到达目标位置的方法是一样的,也是将当前遍历的障碍物位置映射到第一次的运动轨迹中看字典中是否存在如果存在说明在运动过程中碰到了障碍物,返回False,并且需要注意的是需要判断一下障碍物的位置需要在目标位置范围之内碰到才是有效的,因为到达目标位置之后再碰到障碍物是没有用的

3. 代码如下:

模拟:

import collections
from typing import Listclass Solution:def robot(self, command: str, obstacles: List[List[int]], x: int, y: int) -> bool:x0, y0 = 0, 0index = 0dic = collections.defaultdict(int)# 使用元组来表示障碍物的位置for cur in obstacles:dic[(cur[0], cur[1])] += 1while (x0 < x or y0 < y) and (x0, y0) not in dic:if command[index] == "U":y0 += 1else:x0 += 1index = (index + 1) % len(command)return x0 == x and y0 == y

计算周期:

import collections
from typing import Listclass Solution:def robot(self, command: str, obstacles: List[List[int]], x: int, y: int) -> bool:dic = collections.defaultdict(tuple)# 起始坐标x0, y0 = 0, 0dic[(0, 0)] = 1# 记录下第一次的运动轨迹for c in command:if c == "U":y0 += 1else:x0 += 1dic[(x0, y0)] = 1circle = min(x // x0, y // y0)# 第一次轨迹中没有存在这样的点可以到达目标位置if (x - circle * x0, y - circle * y0) not in dic: return False# 判断目标点是否是障碍物的位置, 其实与判断是否可以到达目标位置的方法是一样的for pos in obstacles:xt, yt = pos[0], pos[1]circle = min(xt // x0, yt // y0)# 障碍物必须在目标范围之内if (xt - circle * x0, yt - circle * y0) in dic and xt <= x and yt <= y:return Falsereturn True

LCP 03 机器人大冒险(分析-计算运动周期)相关推荐

  1. 2022-02-22:机器人大冒险。 力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种

    2022-02-22:机器人大冒险. 力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0).小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动.指令有两种 ...

  2. 机器人大冒险(二维数组)

    题目: 力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0).小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动.指令有两种: U: 向y轴正方向移动一格 ...

  3. 领域应用 | 基于知识图谱的警用安保机器人大数据分析技术研究

    本文转载自公众号:警察技术杂志. 郝久月  樊志英   汪宁   王欣   摘   要:构建大数据支撑下的智能应用是公安信息化发展的趋势,警用安保机器人大数据分析平台的核心功能包括机器人智能人机交互和 ...

  4. 如何区分机器人大类的GH和GG

    先放个人和朋友的聊天: 自动驾驶属于机器人大类方向,"开源"自动驾驶方案Apex.AI使用了ROS1和ROS2. 欲了解详情: www.eetasia.com/apex-ai-an ...

  5. 计算机组成原理(分析计算题解析)内附填空,选择,解答题答案

    目录 关于计算机组成原理的填空,选择以及解答题 1. 2. 3. 1.所以首先将整数和小数部分转化成二进制 2.移动小数点 3.得到二进制存储格式 4. 5. 6. 7. 8. 9. 计算机组成原理( ...

  6. 【R】【课程笔记】02+03 基于R软件的计算

    本文是课程<数据科学与金融计算>第2-3章的学习笔记,主要介绍R语言在统计和机器学习中的应用,用于知识点总结和代码练习,Q&A为问题及解决方案,参考书籍为<R软件及其在金融定 ...

  7. 专科段《生产与运作管理》课程复习资料(5)——分析计算题

    小编黑板青云寄语: 1.为了方便打印,答案放在了最后. 2.黑板青云已经为大家尽力校对,难免疏漏,如有疏漏请留言更正. 3.单选题,见"专科段<生产与运作管理>课程复习资料(1) ...

  8. AI算法工程师 | 03人工智能基础-Python科学计算和可视化(三)Pandas

    文章目录 Python 之 数据处理分析模块 Pandas 一.Pandas 开发环境搭建 二.Pandas 数据类型 1. Series 对象创建 2. DataFrame 对象创建 3. 获取 S ...

  9. 眼明、心智、制楔:我们在CES Asia的服务机器人大秀上看到了什么?

    在今年的CES Asia上,除去集中展示的5G.AI等新技术,满场跑的服务机器人照例是一大亮点.猎豹移动.思岚科技.科大讯飞.擎朗智能等厂商都进行了相关展示,其中还有厂商将自己的展区打造成了" ...

  10. LeetCode——LCP 29. 乐团站位[简单]——分析及代码(Java)

    LeetCode--LCP 29. 乐团站位[简单]--分析及代码[Java] 一.题目 二.分析及代码 1. 直接计算 (1)思路 (2)代码 (3)结果 三.其他 一.题目 某乐团的演出场地可视作 ...

最新文章

  1. Android之 AndroidManifest.xml 文件解析
  2. MyEclipse Web 项目的图标和右键New菜单
  3. boost::geometry::select_most_precise用法的测试程序
  4. 免费下载|《云原生时代下的App开发》走进阿里云一站式应用研发平台EMAS
  5. 利用三层交换机实现VLAN间路由配置
  6. OpenStack推出最新版本Newton,显著提升单一云平台 对虚拟化、裸机和容器的管理...
  7. 入行Web前端的学习方法有哪些?
  8. Linux基础——怎么样从手机 (Android安卓/IOS苹果) 通过 SSH 远程 Linux
  9. Javascript:获取点击的li标签内部文字
  10. DLL错误之——无法加载DLL***.dll:找不到指定的模块(异常来自HRESULT:0x8007007E)问题的终极感悟
  11. PHP 简单的页面跳转提示
  12. 做JSP大学实用教程实验
  13. FPGA概述(对FPGA的基本认识)
  14. ppt 形状 文字不居中 怎么办
  15. 百度文件下载慢怎么办?~教你百度网盘无需VIP离线下载大文件
  16. 我的世界热力膨胀JAVA_我的世界热力膨胀MOD矿物类型介绍
  17. 网络计算机抗震计算阻尼比,抗震结构设计经典计算题及答案.doc
  18. 计算长方形的面积 周长 C语言,c语言计算长方形的面积和周长
  19. 苹果手机以旧换新活动_苹果中国宣布以旧换新活动延期至3月25日
  20. cas 自定义登陆异常提示

热门文章

  1. 计算机网络物理层测试
  2. 如何避免谷歌GMC广告被封,被封后又如何解封呢?
  3. python语言for else和 if else误区
  4. 知识图谱文献综述(第一章 知识表示与建模)
  5. 为什么html中使用不了样式,css不起作用是什么原因?
  6. php项目经验总结,php项目心得以及总结
  7. ramdisk实践2:ramdisk制作以及解决传参问题的编程详解
  8. 内网KDC服务器开放在哪个端口,针对kerbores的攻击有哪些?
  9. 获取微信公众号文章内容
  10. 1156 Sexy Primes (20 分)(质数 模拟