题目链接

题目描述

力扣团队买了一个可编程机器人,机器人初始位置在原点(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]不为原点或者终点

题解

由于可以循环, 一个周期, 他的移动范围是: [n, m] (nR的个数, mU的个数)
a (a>=0)个周期, 所管辖的范围是: x: [an, am], y: [an + n, am + m] (共n+1 * m+1个点)
这样, 对任何一个点, 找到他所被管辖的区间, 也就是, 将其 映射到[n, m]这个范围内.

比如, n = 3, m = 2
则, 我们分成: 1号区间: { x:[0, 3], y:[0,2]} 2号区间: { x:[3,6], y:[2,4]}, …

1, 对于一个点(x,y), 如果判断他在哪个区间呢?
… 自然会认为, x / n可以得到他在哪个区间.
… 但是, 这也是本题难点. 对于(x=3, y)这些点, 他在1号 还是在 2号呢?
… 可能会认为, 在哪个区间都可以判断. 其实是错误的
… 比如, 对于3, 1点, 他必须是在1号区间; (如果在2号区间, 他会映射为0, -1, y值越界了, 它会被视为非路径点)
… 比如, 对于3, 3点, 他必须是在2号区间; (如果在1号区间, 他会映射为3, 3, y值越界了, 它会被视为非路径点)
**因此, 需要左右都尝试一下. x / n这个区间 和 (x / n) +1区间, 都去试一试

2, obstacle数组不需要排序, 这里使用反证法
… 如果一个障碍x, y, 确实会在到达终点xx, yy前的路径上的, 则说明:
… 1) x <= xx, y <= yy
… 2) 他处在经过路径上
… 所以, 1)条件 是 成为一个障碍 的 必要条件. 因此, 只去判断所有<=xx,<=yy的障碍即可.

代码

class Solution {public:bool robot(string command, vector<vector<int>>& obstacles, int x, int y) {int n = 0, m = 0;for( char i : command){if( 'U' == i){ ++ m;}if( 'R' == i){ ++ n;}}vector< vector< bool> > grid( n + 5, vector< bool>( m + 5, false));n = 0, m = 0;grid[ n][ m] = true;for( char i : command){if( 'U' == i){ ++ m;}if( 'R' == i){ ++ n;}grid[ n][ m] = true;}for( const auto & cur : obstacles){Ll_ cx = cur[ 0], cy = cur[ 1];if( ( cx > x) || ( cy > y)){continue;}Ll_ k = cx / n;Ll_ dx = cx - k * n;Ll_ dy = cy - k * m;if( ( dx >= 0) && ( dx <= n) && ( dy >= 0) && ( dy <= m)){if( grid[ dx][ dy]){return false;}}-- k;dx = cx - k * n;dy = cy - k * m;if( ( dx >= 0) && ( dx <= n) && ( dy >= 0) && ( dy <= m)){if( grid[ dx][ dy]){if( ( cx <= x) && ( cy <= y)){ return false;}}}}Ll_ k = x / n;Ll_ dx = x - k * n;Ll_ dy = y - k * m;if( ( dx >= 0) && ( dx <= n) && ( dy >= 0) && ( dy <= m)){if( grid[ dx][ dy]){return true;}}-- k;dx = x - k * n;dy = y - k * m;if( ( dx >= 0) && ( dx <= n) && ( dy >= 0) && ( dy <= m)){if( grid[ dx][ dy]){return true;}}return false;}
};

`算法竞赛题解` LCP 03. 机器人大冒险相关推荐

  1. 第三届上海市青少年算法竞赛题解

    第三届上海市青少年算法竞赛题解 T1 数洞洞 #include<bits/stdc++.h> using namespace std; int a[11]={0,1,0,0,0,1,0,1 ...

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

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

  3. `算法竞赛题解` LeetCode.6115 统计理想数组的数目

    题目链接 题目描述 给你两个整数 n 和 maxValue ,用于描述一个 理想数组 . 对于下标从 0 开始.长度为 n 的整数数组 arr ,如果满足以下条件,则认为该数组是一个 理想数组 : 每 ...

  4. `算法竞赛题解` `LeetCode` 6126. 设计食物评分系统

    题目链接 题目 设计一个支持下述操作的食物评分系统: 修改 系统中列出的某种食物的评分. 返回系统中某一类烹饪方式下评分最高的食物. 实现 FoodRatings 类: FoodRatings(Str ...

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

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

  6. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合

    又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...

  7. 江苏机器人竞赛南航_南航金城学院学子在第十届江苏省机器人大赛中获佳绩

    摘要: 南航金城学院学子在第十届江苏省机器人大赛中获佳绩为你介绍2020年10月25-27日,由省教育厅.省科学技术协会和江苏省自动化协会联合举办的第十届江苏省大学生机器人大赛在三江... 2020年 ...

  8. UVA-1598 交易所 题解答案代码 算法竞赛入门经典第二版

    GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 AC代码 有意思的一个题目.书上说这是一个不错的优先队列练习题,但实际上它其实是一个 ...

  9. CCF- CSP 202206-2寻宝!大冒险!暴力算法满分题解

    CCF- CSP 202206-2寻宝!大冒险!暴力算法满分题解 题目链接:202206-2寻宝!大冒险! 思路: 数据范围中n ≤ \leq ≤ 1000,S ≤ \leq ≤ 50,考虑时间复杂度 ...

  10. ICPC程序设计题解书籍系列之九:罗勇军《算法竞赛入门到进阶》

    罗书<算法竞赛入门到进阶>题目一览 第1章 算法竞赛概述 HDU1000 HDU1089-HDU1096 A+B for Input-Output Practice (I)-(VIII)( ...

最新文章

  1. tcpdf html 格式重叠,html - tcpdf(html2pdf)无法正确生成表格边框 - 堆栈内存溢出...
  2. adminlte+layui框架搭建3 - layui弹出层
  3. tomcat server.xml文件的配置解析
  4. USB 设备类代码表
  5. codeforce No to Palindromes!(枚举)
  6. 软件测试黑马程序员课后答案_软件测试课后答案
  7. traceping是什么意思_关于CCNA ,ping 与trace 有什么区别
  8. 【报告分享】2020年数字政府新基建发展白皮书.pdf(附下载链接)
  9. thinkphp 模板 in
  10. NOI2018退役记
  11. csv文件转为shp文件
  12. 淘宝补单发货地不一样可以吗?正确补单流程是什么?
  13. 【前端】菜单栏设计(html、css)
  14. ftp服务器文件防盗链,IIS防盗链组件
  15. 赛马命运已成,微盟在劫难逃
  16. 2021年福建省安全员A证(主要负责人)考试内容及福建省安全员A证(主要负责人)模拟试题
  17. C#1309. 解码字母到整数映射
  18. LeetCode之打印零与奇偶数golang与java实现
  19. 絮絮叨叨C++ template
  20. c语言中scanf是什意思,C语言中的scanf是什么意思

热门文章

  1. Leetcode 853 车队
  2. ORACLE归档日志增大的原因
  3. 使用setBounds()函数设置Java布局
  4. 笔记本 WIFI 热点批处理文件
  5. background 属性介绍
  6. BIOS调整服务器性能模式,BIOS优化性能提升明显 菜鸟必看的BIOS优化设置教程
  7. 怎样用硬盘启动计算机,电脑新增了硬盘,在bios中怎么设置硬盘启动,来看看具体操作步骤...
  8. python-pygame实现飞机大战-2-添加敌机以及碰撞爆炸
  9. druid加密数据库密码
  10. 计算机的快速启动栏,电脑快速启动栏不见了