2022-02-22:机器人大冒险。
力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种:
U: 向y轴正方向移动一格
R: 向x轴正方向移动一格。
不幸的是,在 xy 平面上还有一些障碍物,他们的坐标用obstacles表示。机器人一旦碰到障碍物就会被损毁。
给定终点坐标(x, y),返回机器人能否完好地到达终点。如果能,返回true;否则返回false。

输入: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的长度 <= 1000
command由U,R构成,且至少有一个U,至少有一个R
0 <= x <= 1e9, 0 <= y <= 1e9
0 <= obstacles的长度 <= 1000
obstacles[i]不为原点或者终点

力扣LCP03。

答案2022-02-22:

具体见代码。

代码用golang编写。代码如下:

  1. package main
  2. import "fmt"
  3. func main() {
  4. if true {
  5. command := "URR"
  6. obstacles := [][]int{}
  7. x := 3
  8. y := 2
  9. ret := robot1(command, obstacles, x, y)
  10. fmt.Println(ret)
  11. }
  12. if true {
  13. command := "URR"
  14. obstacles := [][]int{}
  15. x := 3
  16. y := 2
  17. ret := robot2(command, obstacles, x, y)
  18. fmt.Println(ret)
  19. }
  20. }
  21. func twoSelectOne(c bool, a, b int) int {
  22. if c {
  23. return a
  24. } else {
  25. return b
  26. }
  27. }
  28. func getMin(a, b int) int {
  29. if a < b {
  30. return a
  31. } else {
  32. return b
  33. }
  34. }
  35. func robot1(command string, obstacles [][]int, x, y int) bool {
  36. X := 0
  37. Y := 0
  38. //HashSet<Integer> set = new HashSet<>();
  39. set := make(map[int]struct{})
  40. //set.add(0);
  41. set[0] = struct{}{}
  42. for _, c := range []byte(command) {
  43. X += twoSelectOne(c == 'R', 1, 0)
  44. Y += twoSelectOne(c == 'U', 1, 0)
  45. set[(X<<10)|Y] = struct{}{}
  46. }
  47. // 不考虑任何额外的点,机器人能不能到达,(x,y)
  48. if !meet1(x, y, X, Y, set) {
  49. return false
  50. }
  51. for _, ob := range obstacles { // ob[0] ob[1]
  52. if ob[0] <= x && ob[1] <= y && meet1(ob[0], ob[1], X, Y, set) {
  53. return false
  54. }
  55. }
  56. return true
  57. }
  58. // 一轮以内,X,往右一共有几个单位
  59. // Y, 往上一共有几个单位
  60. // set, 一轮以内的所有可能性
  61. // (x,y)要去的点
  62. // 机器人从(0,0)位置,能不能走到(x,y)
  63. func meet1(x, y, X, Y int, set map[int]struct{}) bool {
  64. if X == 0 { // Y != 0 往上肯定走了!
  65. return x == 0
  66. }
  67. if Y == 0 {
  68. return y == 0
  69. }
  70. // 至少几轮?
  71. atLeast := getMin(x/X, y/Y)
  72. // 经历过最少轮数后,x剩多少?
  73. rx := x - atLeast*X
  74. // 经历过最少轮数后,y剩多少?
  75. ry := y - atLeast*Y
  76. _, ok := set[(rx<<10)|ry]
  77. return ok
  78. }
  79. // 此处为一轮以内,x和y最大能移动的步数,对应的2的几次方
  80. // 比如本题,x和y最大能移动1000步,就对应2的10次方
  81. // 如果换一个数据量,x和y最大能移动5000步,就对应2的13次方
  82. // 只需要根据数据量修改这一个变量,剩下的代码不需要调整
  83. //public static final int bit = 10;
  84. var bit = 10
  85. // 如果,x和y最大能移动的步数,对应2的bit次方
  86. // 那么一个坐标(x,y),所有的可能性就是:(2 ^ bit) ^ 2 = 2 ^ (bit * 2)
  87. // 也就是,(1 << (bit << 1))个状态,记为bits
  88. //public static int bits = (1 << (bit << 1));
  89. var bits = (1 << (bit << 1))
  90. // 为了表示下bits个状态,需要几个整数?
  91. // 32位只需要一个整数,所以bits个状态,需要bits / 32 个整数
  92. // 即整型长度需要 : bits >> 5
  93. //public static int[] set = new int[bits >> 5];
  94. var set = make([]int, bits>>5)
  95. func robot2(command string, obstacles [][]int, x, y int) bool {
  96. //Arrays.fill(set, 0);
  97. for i := 0; i < len(set); i++ {
  98. set[i] = 0
  99. }
  100. set[0] = 1
  101. X := 0
  102. Y := 0
  103. for _, c := range []byte(command) {
  104. X += twoSelectOne(c == 'R', 1, 0)
  105. Y += twoSelectOne(c == 'U', 1, 0)
  106. add((X << 10) | Y)
  107. }
  108. if !meet2(x, y, X, Y) {
  109. return false
  110. }
  111. for _, ob := range obstacles {
  112. if ob[0] <= x && ob[1] <= y && meet2(ob[0], ob[1], X, Y) {
  113. return false
  114. }
  115. }
  116. return true
  117. }
  118. func meet2(x, y, X, Y int) bool {
  119. if X == 0 {
  120. return x == 0
  121. }
  122. if Y == 0 {
  123. return y == 0
  124. }
  125. atLeast := getMin(x/X, y/Y)
  126. rx := x - atLeast*X
  127. ry := y - atLeast*Y
  128. return contains((rx << 10) | ry)
  129. }
  130. func add(status int) {
  131. set[status>>5] |= 1 << (status & 31)
  132. }
  133. func contains(status int) bool {
  134. return (status < bits) && (set[status>>5]&(1<<(status&31))) != 0
  135. }
  136. // int num -> 32位的状态
  137. // 请打印这32位状态
  138. func printBinary(num int) {
  139. for i := 31; i >= 0; i-- {
  140. //System.out.print((num & (1 << i)) != 0 ? "1" : "0");
  141. if (num & (1 << i)) != 0 {
  142. fmt.Print("1")
  143. } else {
  144. fmt.Print("0")
  145. }
  146. }
  147. //System.out.println();
  148. fmt.Println("")
  149. }

执行结果如下:


左神java代码

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

  1. LeetCode LCP 3 机器人大冒险

    题目解析: 对于本题主要的核心是对于一个指令字符串如“RURUU”,如果我们假设它的终点坐标为(8,8),其实只要统计指令字符串中的R的个数和U的个数(对于我给出的例子而言,num_R == 2,nu ...

  2. LCP 03.机器人大冒险

    def robot(command, obstacles, x, y): xx = 0 yy = 0 tmp = [] for c in command: if c == 'U': yy += 1 i ...

  3. 力扣Leetcode 572. 另一个树的子树

    另一个树的子树 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 ...

  4. 关于搜索elasticsearch的数据条数大于10000的坑 max_result_window的两种设置方式

    当用elasticsearch进行深度分页查询时的size-from大于10000的时候,就会报错“”, 官方推荐是scroll查询返回结果是无序的不满足业务需求,所以还是通过设置最大返回结果数来达到 ...

  5. Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式

    1.Class对象获取的三种方式 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463 上一章节已经说过,一般情况下,Jav ...

  6. mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样

    Mybatis批量更新数据 mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样 mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样 mybatis批 ...

  7. [整理] C#调用SQLDMO.DLL时间数据库备份 / 还原。 (香神无涯) // C#实现SQLSERVER2000数据库备份还原的两种方法 (带进度条)

    /// <summary>/// 通过调用MSSQL的SQLDMO.DLL文件来实现备份数据库/// 1.首先在在项目中引用SQLDMO.DLL文件./// 2.在引用中的SQLDMO.D ...

  8. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  9. android-自定义广告轮播Banner(无限循环实现)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  10. Python解答力扣网站题库简单版----第三讲

    1041. 困于环中的机器人 题库链接: 1041. 困于环中的机器人. 题干 在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方.机器人可以接受下列三条指令之一: "G" ...

随机推荐

  1. Python项目案例开发从入门到实战 - 书籍信息

    Python项目案例开发从入门到实战 - 爬虫.游戏和机器学习(微课版) 作者:郑秋生 夏敏捷 清华大学出版社 ISBN:978-7-302-45970-5

  2. 设计一款可扩展和基于windows系统的一键处理表格小工具思路

    原创总结/朱季谦 设计一款可扩展和基于windows系统的一键处理表格小工具思路 日常开发当中,业务人员经常会遇到一些重复性整理表格的事情,这时候,就可以通过一些方式进行自动化程序处理,提高工作(摸鱼 ...

  3. Solon2 接口开发: 强化 Gateway 模式

    一般可以从这几方面对 Gateway 模式进行强化: 定制异常状态码 定制基类 将一些处理独立封装成类 接口只返回数据部份,异常状态用抛 强化之后,具体的网关即简单,又功能强大.同时会对团队开发形成一 ...

  4. java多线性--线程创建

    java多线性--线程创建 什么是多线程:不同的功能同时进行 Process(进程)与Thread(线程) 进程是执行程序的一次执行过程,是一个动态的概念.是系统分配资源的单位. 一个进程分为多个线程 ...

  5. MyBatisPlus 逻辑删除演示

    一.数据库 数据库中添加逻辑删除字段:

  6. Django笔记六之外键ForeignKey介绍

    这一篇笔记介绍 Django 系统 model 的外键处理,ForeignKey 以及相应的处理方法. 这是一种一对多的字段类型,表示两张表之间的关联关系. 本篇笔记的目录如下: on_delete ...

  7. 鸿蒙开发学习笔记-UIAbility-Router页面跳转接口源码分析

    在鸿蒙开发中,UIAbility的跳转使用 router 方法. 在使用的时候需导入 import router from '@ohos.router'; 该方法接口成员如下: 1.interface ...

  8. 关于Java中的异常处理(详细)

    Error:Java虚拟机无法解决的严重问题.如:JVM系统内部错误.资源耗尽等严重情况.比如:StackOverflowError和OOM.一般不编写针对性的代码进行处理 Exception:其它因 ...

  9. 二进制安装Kubernetes,一键安装脚本

    背景,最近几天闲着研究Kubernetes,发现使用手动二进制安装会有些繁琐.经过突发奇想,就出现这个脚本. 声明,该脚本不及互联网上其他大佬的一件脚本,该脚本仅仅是突发奇想编写的,希望大佬不喜勿喷. ...

  10. python之爬虫三

    20xpath入门 在编写爬虫程序的过程中提取信息是非常重要的环节,但是有时使用正则表达式无法匹配到想要的信息,或者书写起来非常麻烦,此时就需要用另外一种数据解析方法,也就是本节要介绍的 Xpath ...