2022-02-22:机器人大冒险。 力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种
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编写。代码如下:
package main
import "fmt"
func main() {
if true {
command := "URR"
obstacles := [][]int{}
x := 3
y := 2
ret := robot1(command, obstacles, x, y)
fmt.Println(ret)
}
if true {
command := "URR"
obstacles := [][]int{}
x := 3
y := 2
ret := robot2(command, obstacles, x, y)
fmt.Println(ret)
}
}
func twoSelectOne(c bool, a, b int) int {
if c {
return a
} else {
return b
}
}
func getMin(a, b int) int {
if a < b {
return a
} else {
return b
}
}
func robot1(command string, obstacles [][]int, x, y int) bool {
X := 0
Y := 0
//HashSet<Integer> set = new HashSet<>();
set := make(map[int]struct{})
//set.add(0);
set[0] = struct{}{}
for _, c := range []byte(command) {
X += twoSelectOne(c == 'R', 1, 0)
Y += twoSelectOne(c == 'U', 1, 0)
set[(X<<10)|Y] = struct{}{}
}
// 不考虑任何额外的点,机器人能不能到达,(x,y)
if !meet1(x, y, X, Y, set) {
return false
}
for _, ob := range obstacles { // ob[0] ob[1]
if ob[0] <= x && ob[1] <= y && meet1(ob[0], ob[1], X, Y, set) {
return false
}
}
return true
}
// 一轮以内,X,往右一共有几个单位
// Y, 往上一共有几个单位
// set, 一轮以内的所有可能性
// (x,y)要去的点
// 机器人从(0,0)位置,能不能走到(x,y)
func meet1(x, y, X, Y int, set map[int]struct{}) bool {
if X == 0 { // Y != 0 往上肯定走了!
return x == 0
}
if Y == 0 {
return y == 0
}
// 至少几轮?
atLeast := getMin(x/X, y/Y)
// 经历过最少轮数后,x剩多少?
rx := x - atLeast*X
// 经历过最少轮数后,y剩多少?
ry := y - atLeast*Y
_, ok := set[(rx<<10)|ry]
return ok
}
// 此处为一轮以内,x和y最大能移动的步数,对应的2的几次方
// 比如本题,x和y最大能移动1000步,就对应2的10次方
// 如果换一个数据量,x和y最大能移动5000步,就对应2的13次方
// 只需要根据数据量修改这一个变量,剩下的代码不需要调整
//public static final int bit = 10;
var bit = 10
// 如果,x和y最大能移动的步数,对应2的bit次方
// 那么一个坐标(x,y),所有的可能性就是:(2 ^ bit) ^ 2 = 2 ^ (bit * 2)
// 也就是,(1 << (bit << 1))个状态,记为bits
//public static int bits = (1 << (bit << 1));
var bits = (1 << (bit << 1))
// 为了表示下bits个状态,需要几个整数?
// 32位只需要一个整数,所以bits个状态,需要bits / 32 个整数
// 即整型长度需要 : bits >> 5
//public static int[] set = new int[bits >> 5];
var set = make([]int, bits>>5)
func robot2(command string, obstacles [][]int, x, y int) bool {
//Arrays.fill(set, 0);
for i := 0; i < len(set); i++ {
set[i] = 0
}
set[0] = 1
X := 0
Y := 0
for _, c := range []byte(command) {
X += twoSelectOne(c == 'R', 1, 0)
Y += twoSelectOne(c == 'U', 1, 0)
add((X << 10) | Y)
}
if !meet2(x, y, X, Y) {
return false
}
for _, ob := range obstacles {
if ob[0] <= x && ob[1] <= y && meet2(ob[0], ob[1], X, Y) {
return false
}
}
return true
}
func meet2(x, y, X, Y int) bool {
if X == 0 {
return x == 0
}
if Y == 0 {
return y == 0
}
atLeast := getMin(x/X, y/Y)
rx := x - atLeast*X
ry := y - atLeast*Y
return contains((rx << 10) | ry)
}
func add(status int) {
set[status>>5] |= 1 << (status & 31)
}
func contains(status int) bool {
return (status < bits) && (set[status>>5]&(1<<(status&31))) != 0
}
// int num -> 32位的状态
// 请打印这32位状态
func printBinary(num int) {
for i := 31; i >= 0; i-- {
//System.out.print((num & (1 << i)) != 0 ? "1" : "0");
if (num & (1 << i)) != 0 {
fmt.Print("1")
} else {
fmt.Print("0")
}
}
//System.out.println();
fmt.Println("")
}
执行结果如下:

2022-02-22:机器人大冒险。 力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种的更多相关文章
- LeetCode LCP 3 机器人大冒险
题目解析: 对于本题主要的核心是对于一个指令字符串如“RURUU”,如果我们假设它的终点坐标为(8,8),其实只要统计指令字符串中的R的个数和U的个数(对于我给出的例子而言,num_R == 2,nu ...
- LCP 03.机器人大冒险
def robot(command, obstacles, x, y): xx = 0 yy = 0 tmp = [] for c in command: if c == 'U': yy += 1 i ...
- 力扣Leetcode 572. 另一个树的子树
另一个树的子树 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 示例 ...
- 关于搜索elasticsearch的数据条数大于10000的坑 max_result_window的两种设置方式
当用elasticsearch进行深度分页查询时的size-from大于10000的时候,就会报错“”, 官方推荐是scroll查询返回结果是无序的不满足业务需求,所以还是通过设置最大返回结果数来达到 ...
- Java反射02 : Class对象获取的三种方式和通过反射实例化对象的两种方式
1.Class对象获取的三种方式 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463 上一章节已经说过,一般情况下,Jav ...
- mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样
Mybatis批量更新数据 mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样 mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样 mybatis批 ...
- [整理] C#调用SQLDMO.DLL时间数据库备份 / 还原。 (香神无涯) // C#实现SQLSERVER2000数据库备份还原的两种方法 (带进度条)
/// <summary>/// 通过调用MSSQL的SQLDMO.DLL文件来实现备份数据库/// 1.首先在在项目中引用SQLDMO.DLL文件./// 2.在引用中的SQLDMO.D ...
- 安卓开发笔记——自定义广告轮播Banner(实现无限循环)
关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...
- android-自定义广告轮播Banner(无限循环实现)
关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...
- Python解答力扣网站题库简单版----第三讲
1041. 困于环中的机器人 题库链接: 1041. 困于环中的机器人. 题干 在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方.机器人可以接受下列三条指令之一: "G" ...
随机推荐
- WinUI(WASDK)使用ChatGPT和摄像头手势识别结合TTS让机器人更智能
前言 之前写过一篇基于ML.NET的手部关键点分类的博客,可以根据图片进行手部的提取分类,于是我就将手势分类和摄像头数据结合,集成到了我开发的电子脑壳软件里. 电子脑壳是一个为稚晖君开源的桌面机器人E ...
- JavaWeb相关学习环境的配置(一)
JavaWeb相关学习环境的配置(一) 之 JDK的配置 步骤: 1.去官网找到自己想要下载的版本: 官网地址:https://www.oracle.com/java/technologies/dow ...
- Windows命令行备份文件
windows命令行备份文件 0 前言 前段时间,笔者因为在C盘爆满的情况下被windows自动更新了(大概),出现了以下情况: 在试了几种方法后不起作用,无奈下只能重装系统. 在这之前要把之前的一些 ...
- 基于 Web SDK 实现视频通话场景 | 声网 SDK 教程
声网视频 SDK 被广泛应用于多种实时互动场景中,例如视频会议.视频通话.音视频社交.在线教育等.为了让刚刚接触声网 SDK 的开发者,可以更顺畅地实现基础的视频通话功能,我们基于声网 Web SDK ...
- 第一章 1.1.1节 Kubeadm安装K8S高可用集群
1.1 安装前必读 请不要使用带中文的服务器和克隆的虚拟机. 生产环境建议使用二进制的方式安装. 文档中的IP地址要更换成自己的IP地址,要谨记!!! 1.2 基本环境配置 kubeadm安装方式自1 ...
- C++温故补缺(十九):atomic类
atomic 参考:c++11 多线程(3)atomic 总结 - 简书.c++11 atomic Npgw的博客.C++11 并发指南系列 - Haippy - 博客园. atomic_flag a ...
- 在Vue3+TypeScript 前端项目中使用事件总线Mitt
事件总线Mitt使用非常简单,本篇随笔介绍在Vue3+TypeScript 前端项目中使用的一些场景和思路.我们在Vue 的项目中,经常会通过emits 触发事件来通知组件或者页面进行相应的处理,不过 ...
- 案例: 利用 Hugging Face 进行复杂文本分类
Witty 与 Hugging Face 专家加速计划的成功案例 如果你对如何更快构建 ML 解决方案感兴趣,请访问 专家加速计划 登陆页面并通过 填写表单 联系我们! 业务背景 随着 IT 技术不断 ...
- 聊聊Spring扩展点BeanPostProcessor和BeanFactoryPostProcessor
介绍 今天聊一聊spring中很重要的两个扩展点BeanPostProcessor和BeanFactoryPostProcessor,spring之所以如次强大,是因为它提供了丰富的功能给我们使用,但 ...
- 技术分享:Proxy-Pool代理池搭建IP代理
技术分享:Proxy-Pool代理池搭建IP代理 前言本章内容仅供参考,不涉及实际使用,主要使用Python环境和Redis数据库进行环境搭建,工具网盘存储如下,有问题可以私聊我.网址:https:/ ...