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

待会的代码由两部分组成:
最前面的一个robot2方法效果较好,无论对于数据量过大的还是其他的情况,效果都还可以忍受,它的思路是将障碍物位置转化为目的地,因为有些障碍物根本无法到达,所以我们可以很轻松的排除掉一些,其次由于障碍物的数量总是有限的,不值当我们每走一步路就去判断是否撞上了,这样就会减少很多时间。我们将所有障碍物遍历完后,若是能到达障碍物则说明会碰撞上。否则,再遍历真正目的地若是能到达则返回真,不能到达返回假
后面的robot方法是每走一步路就对其是否碰撞进行检测,说实话效果在数据量比较大的时候不是很好。诸君且看吧

package medium;import java.util.Arrays;public class robottest {//换一个思路,把每个障碍物,看作是目的地,看看其能否到达public boolean robot2(String command, int[][] obstacles, int x, int y) {boolean flag=false;for(int i=0;i<obstacles.length;i++){int i1= obstacles[i][0];int i2= obstacles[i][1];if(i1<=x&&i2<=y)flag=isAcess(command,i1,i2);if(flag==true)return false;}flag=isAcess(command, x, y);return flag;}public boolean isAcess(String command,int x,int y){int xNum=0;int yNum=0;int[] position=new int[2];while(xNum!=x||yNum!=y){for(int i=0;i<command.length()&&(position[0]!=x||position[1]!=y);i++){char c=command.charAt(i);if(c=='U')position[1]=position[1]+1;else if(c=='R')position[0]=position[0]+1;}xNum=position[0];yNum=position[1];if(xNum>x&&yNum>y)return false;}if(position[0]==x&&position[1]==y){return true;}return false;}//对于大数据量效果不好的算法public boolean robot(String command, int[][] obstacles, int x, int y) {int xNum=0;int yNum=0;boolean flag=false;int[] position=new int[2];while(xNum!=x&&yNum!=y){for(int i=0;i<command.length()&&(position[0]!=x||position[1]!=y);i++){char c=command.charAt(i);if(c=='U')position[1]=position[1]+1;else if(c=='R')position[0]=position[0]+1;flag=obstacles.length>0?isBone(position,obstacles):false;if(flag)return false;}obstacles=obstacles.length>0?Haveob(obstacles):obstacles;xNum=position[0];yNum=position[1];if(xNum>x&&yNum>y)return false;}if(position[0]==x&&position[1]==y){return true;}return false;}private int[][] Haveob(int[][] obstacles) {int j=0;for(int i=0;i<obstacles.length;i++){if(obstacles[i][0]!=-1)j++;}int[][] re=new int[j][2];int k=0;for(int i=0;i<obstacles.length;i++){if(obstacles[i][0]!=-1){re[k][0]=obstacles[i][0];re[k][1]=obstacles[i][1];k++;}}return re;}private boolean isBone(int[] position, int[][] obstacles) {boolean flag=false;for(int i=0;i<obstacles.length;i++){if(obstacles[i][0]==position[0]&&obstacles[i][1]==position[1]){flag=true;break;}if(obstacles[i][0]<position[0]||obstacles[i][1]<position[1]){obstacles[i][0]=-1;obstacles[i][1]=-1;}}return flag;}public static void main(String[] args) {robottest r=new robottest();String command="UUR";//"RUR";//"URR";"RUR"int[] p={1,1};int[][] s={};//{{9, 5}, {7, 5}, {6, 10}, {8, 9}, {4, 2}, {8, 3}, {3, 2}};//{3, 9}, {7, 1}, {10, 5}, {6, 3}, {4, 3}, {1, 0}, {6, 5}};//{{2,2}};System.out.println(r.robot(command,s,1,4)); System.out.println(r.robot2(command,s,1,4));}}

力扣LCP3机器人大冒险相关推荐

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

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

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

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

  3. LeetCode 2019 力扣杯全国秋季编程大赛

    文章目录 1. 比赛结果 2. 题目解析 2.1 猜数字 Easy 2.2 分式化简 Esay 2.3 机器人大冒险 Medium 2.4 覆盖 Hard 2.5 发 LeetCoin Hard 1. ...

  4. LeetCode 2020 力扣杯全国春季编程大赛(1644/4093,前40.2%)

    文章目录 1. 比赛结果 2. 题目解析 2.1 拿硬币 Easy 2.2 传递信息 Esay 2.3 剧情触发时间 Medium 2.4 最小跳跃次数 Hard 2.5 二叉树任务调度 Hard 1 ...

  5. 力扣随机数randX——透过现象看本质之二元独立随机分布

    用randX 实现 randY(X < Y) 其中,randN表示等概生成[1,N]的数 从一个力扣上的例子来引入吧 470. 用 Rand7() 实现 Rand10() 最直观的想法是用ran ...

  6. Day6-2021.1.14 计算机网络面经从基础到总结+力扣 链表 题目的整理。

    2021年1月14日 时间都去哪了? 今日计划: 1.力扣刷题.整理下剑指offer,按照分类去做.LeetCode题解汇总-链表专题. 2.整理计网面经.如果要走后端的话,这篇面经基本很全了,把这篇 ...

  7. 力扣杯2023春-个人赛、战队赛

    文章目录 力扣杯2023春-个人赛 [LCP 72. 补给马车](https://leetcode.cn/problems/hqCnmP/) 模拟 [LCP 73. 探险营地](https://lee ...

  8. 【算法竞赛】力扣杯春赛-个人赛 LCCUP‘23复盘

    力扣杯春赛-个人赛 LCCUP'23 LCP 72. 补给马车 关键词:模拟 题目来源:LCP 72. 补给马车 - 力扣(Leetcode) 题目描述 T模拟 远征队即将开启未知的冒险之旅,不过在此 ...

  9. 【算法比赛】2020 力扣杯!Code Your Future 春季全国编程大赛

    这个比赛,除了最后一题,其他四题其实没啥难度. 第一题:模拟. 第二题:BFS 或者 DP. 第三题:二分. 第四题:BFS. 第五题:思维 + 树的 DFS. 详细题解如下. 1.拿硬币 AC代码( ...

  10. 2020 力扣杯!Code Your Future 春季全国编程大赛题解

    目录 1. 拿硬币 2. 传递信息 3. 剧情触发时间 4. 最小跳跃次数 5. 二叉树任务调度 1. 拿硬币 桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中.我们每次可以选择任意一堆,拿 ...

最新文章

  1. 2022-2028年中国TFT玻璃行业市场研究及前瞻分析报告
  2. 起售价近5500,嘲讽了iPhone X的华为Mate 10却没用上人脸识别
  3. 谷歌研究院最新发现:训练结果不准确,超大数据规模要背锅!
  4. 浅析企业网站排名低可能是哪些原因导致的呢?
  5. python java
  6. XML与DataSet的相互转换
  7. 别瞎学了,这几门语言要被淘汰了!
  8. python3版本无法加载reload解决办法NameError: name 'reload' is not defined
  9. hexo部署成功但是没效果_使用 Hexo+GitHub 搭建个人免费博客教程(小白向)
  10. Spring Cloud学习总结(1)——Spring Cloud及微服务入门
  11. Atitit.工作流系统的本质是dsl 图形化的dsl  4gl
  12. mysql根据身份证得到年龄_MySQL根据身份证获取省份 年龄 性别
  13. MySql分页查询limit
  14. 编一程序,将两个字符串连接起来,不要用strcat函数。C语言
  15. java青蛙跳台阶问题
  16. qt界面切换时出现的绿色背景修改
  17. 明明有本事,为什么难升职?
  18. 虫洞 Wormhole
  19. pe下bootice修复Linux引导,pe下修复引导不成功?这种方法才是最有效的解决方法...
  20. SMETA验厂辅导,对于已经通过了审核公司的ETI标准验厂,如何将验厂结果上传到SEDEX上

热门文章

  1. android光谱图软件,光谱精灵精华版Plus
  2. SQL SERVER2000安装挂起问题
  3. 齐齐哈尔市全国计算机等级考试,2019年3月黑龙江省齐齐哈尔市计算机等级考试注意事项...
  4. java chr()_chr码值对应列表大全
  5. 攻防世界backup
  6. MYS-6ULX-IOT 开发板测评——使用MfgTool更新系统
  7. 手把手教你在自己的扫描器中,集(bai)成(piao)大名鼎鼎的漏扫描工具nuclei
  8. Lua中的os.time和os.date以及时区计算
  9. linux类mac桌面,让Linux Mint看起来更像Mac桌面的主题
  10. 如何在MSDN上获取Win7镜像