0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

模拟机器人行走

冬至子 来源:i余数 作者:i余数 2023-06-07 17:01 次阅读

机器人在一个无限大小的 XY 网格平面上行走,从点 处开始出发,面向北方。该机器人可以接收以下三种类型的命令 :

  • :向左转 度
  • :向右转 度
  • :向前移动 个单位长度

在网格上有一些格子被视为障碍物 。第 i 个障碍物位于网格点 。

机器人无法走到障碍物上,它将会停留在障碍物的前一个网格方块上,但仍然可以继续尝试进行该路线的其余部分。

返回从原点到机器人所有经过的路径点(坐标为整数)的最大欧式距离的平方。(即,如果距离为 ,则返回 )

注意:

  • 北表示 +Y 方向。
  • 东表示 +X 方向。
  • 南表示 -Y 方向。
  • 西表示 -X 方向。

示例 1:

输入:commands = [4,-1,3], obstacles = []

输出:25

解释: 机器人开始位于 (0, 0):

  1. 向北移动 4 个单位,到达 (0, 4)
  2. 右转
  3. 向东移动 3 个单位,到达 (3, 4) 距离原点最远的是 (3, 4) ,距离为 32 + 42 = 25

示例 2:

输入:commands = [4,-1,4,-2,4], obstacles = [[2,4]]

输出:65

解释:机器人开始位于 (0, 0):

  1. 向北移动 4 个单位,到达 (0, 4)
  2. 右转
  3. 向东移动 1 个单位,然后被位于 (2, 4) 的障碍物阻挡,机器人停在 (1, 4)
  4. 左转
  5. 向北走 4 个单位,到达 (1, 8) 距离原点最远的是 (1, 8) ,距离为 12 + 82 = 65

提示:

1.jpg

题解思路

1.jpg

如示例2图示:

1.jpg

代码实现的难点在于方向的切换,这一类题目我们统一采用 「方向数组」 来处理。

我们定义当前方向为dir,可取值为 {0,1,2,3};分别代表 {北,东,南,西}。见上图。

那么当机器人遇到改变方向的命令时,我们直接修改dir的值即可:

1.jpg

然后再分别在 xy 两个方向上定义两个方向数组,以Java为例:

int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
  1. 方向为北(0)时:每次前进 x 不变,y 加一。
  2. 方向为东(1)时:每次前进 x 加一,y 不变。
  3. 方向为南(2)时:每次前进 x 不变,y 减一。
  4. 方向为西(3)时:每次前进 x 减一,y 不变。

1.jpg

代码实现

Java

class Solution {

    private Set< Integer > obstacleSet = new HashSet<  >();
    private int factor = 100000;

    public int robotSim(int[] commands, int[][] obstacles) {

        genObstacleSet(obstacles);

        // 当前方向,北:0, 东:1,南:2, 西:3
        int dir = 0;

        // 方向数组
        int[] dx = {0, 1, 0, -1};
        int[] dy = {1, 0, -1, 0};

        // 机器人位置
        int x = 0, y = 0; 
        int ans = 0;
        for(int command : commands){
            if(command == -2){
                dir = (dir + 3) % 4;
                continue;
            }if(command == -1){
                dir = (dir + 1) % 4;
                continue;
            }
            for(int i = 0; i < command; i++){
                // 如果遇到障碍物,停止在当前位置
                if(isObstacle(x + dx[dir], y + dy[dir])){
                    break;
                }
                x += dx[dir];
                y += dy[dir];
                ans = Math.max(ans, x * x + y * y);
            }
        }

        return ans;

    }

    // 判断是否是障碍物
    private boolean isObstacle(int x, int y){
        return obstacleSet.contains(factor * x + y);
    }

    private void genObstacleSet(int[][] obstacles){

        for(int[] obstacle : obstacles){
            obstacleSet.add(factor * obstacle[0] + obstacle[1]);
        }

    }
}

Go

func robotSim(commands []int, obstacles [][]int) int {

    // 初始化障碍点位
    obstacleMap := make(map[[2]int]bool)
    for _, obstacle := range obstacles {
        obstacleMap[[2]int{obstacle[0], obstacle[1]}] = true
    }

    // 当前方向
    dir := 0

    // 方向数组
    dx, dy := []int{0, 1, 0, -1}, []int{1, 0, -1, 0}

    // 当前位置
    x, y := 0, 0

    // 答案
    ans := 0

    for _, command := range commands {
        if command == -2 {
            dir = (dir + 3) % 4
            continue
        }

        if command == -1 {
            dir = (dir + 1) % 4
            continue
        }

        for i := 0; i < command; i++ {
            // 遇到障碍物
            if _, ok := obstacleMap[[2]int{x + dx[dir], y + dy[dir]}]; ok {
                break;
            }
            x += dx[dir]
            y += dy[dir]

            ans = max(ans, x * x + y * y)
        }
    }

    return ans

}

func max(a int, b int) int {
    if a > b {
        return a
    }
    return b
}

复杂度分析

1.jpg

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器人
    +关注

    关注

    211

    文章

    28423

    浏览量

    207131
  • 变换器
    +关注

    关注

    17

    文章

    2099

    浏览量

    109310
  • JAVA
    +关注

    关注

    19

    文章

    2967

    浏览量

    104761
收藏 人收藏

    评论

    相关推荐

    单足机器人行走

    `<p><strong>项目说明:</strong>该项目使用单片机为控制核心完成对单足机器人站立,行走的控制
    发表于 10-24 19:02

    中国工业机器人行业发展和未来趋势分析

    了3个阶段:70年代的萌芽期,80年代的开发期和90年代的适用化期。当今工业机器人技术正逐渐向着具有行走能力、具有多种感知能力、具有较强的对作业环境的自适应能力的方向发展。当前,对全球机器人技术的发展
    发表于 04-25 16:45

    【mBot申请】双足行走机器人设计

    ,各个传感器模块之间的联系。项目描述:双足行走机器人主要功能实现了机器人行走,周围环境温度、湿度等数据的检测和实时画面的传输,机器人行走
    发表于 11-30 15:57

    企鹅机器人是怎么样的?

    企鹅机器人由BS2控制器控制两个角度舵机实现模拟企鹅的行走,包括前进,后退与转向,同时还可以控制另外两个角度舵机模拟企鹅翅膀的动作;语音播放模块可以发出企鹅真实的叫声。企鹅
    发表于 03-29 17:29

    机器人行业,我从哪里入手

    各位大神们好,我是刚毕业的大学生。我想进入机器人行业,但不知道从什么地方入手。你们能不能给我指点一下
    发表于 12-12 18:12

    辅助行走的老人智能搀扶机器人设计

    `现在的社会状况,老龄化越来越大,随着年纪的增长,吃饭手抖,行走不方便,这些都是年龄增大都要经历的事情。智能关注老人生活健康,针对行动不方便,工业设计公司设计出了这款老人搀扶机器人设计,用来辅助老人行走
    发表于 10-12 17:42

    工业机器人仿真与编程

    ,欢迎关注!概述很多时候由于安装场地限制的原因,使用ABB机器人厂商提供的标准行走轴并不能满足系统集成的需求。这个时候就需要自定义设计机器人行走轴,对机器人生产线进行仿真时就同样需要使
    发表于 09-07 08:57

    自制一个单独行走机器人

    描述自主机器人这个项目是一个单独行走机器人,奇妙的是它的简单和使用很少的组件,它走在一条黑色的“轨道”线上。你会喜欢的,它很受孩子们欢迎。PCB
    发表于 07-13 07:30

    基于激光扫描的移动机器人行走环境直线检测_文伟松

    基于激光扫描的移动机器人行走环境直线检测_文伟松
    发表于 03-19 19:25 0次下载

    大型17R“加藤一郎”结构双足机器人仿人行走控制研究

    针对大型17R加藤一郎结构双足机器人仿人行走控制问题,从仿人机器人的机械结构、控制系统、步态仿真、动力学参数等方面对机器人的影响进行了研究,采用仿生学原理,参考了人体上、下半身比例特点
    发表于 03-02 15:59 1次下载
    大型17R“加藤一郎”结构双足<b class='flag-5'>机器人</b>仿<b class='flag-5'>人行走</b>控制研究

    看看一般都有什么连杆机构适于用于机器人行走

    是由Jansen发明的,用于模拟平稳行走,Jansen利用这种连杆制造了著名的海滩巨兽,这种连杆兼具美学价值和技术优势,通过简单的旋转输入就可模仿生物行走运动,这种连杆已经用于行走
    的头像 发表于 07-24 14:50 1.4w次阅读
    看看一般都有什么连杆机构适于用于<b class='flag-5'>机器人行走</b>的

    双足行走机器人步行原理是什么?步态轨迹规划的详细分析资料概述

    行走轨迹,使得机器人行走姿态更像人类的行走.通过模拟测试,结果表明了用三次多项式插值方法是1种规划双足
    发表于 08-13 08:00 102次下载

    用于辅助老人行走/康复锻炼的搀扶机器人

    现在的社会状况,老龄化越来越大,随着年纪的增长,吃饭手抖,行走不方便,这些都是年龄增大都要经历的事情。智能关注老人生活健康,针对行动不方便,工业设计公司设计出了这款老人搀扶机器人设计,用来辅助老人行走、康复锻炼的智能产品。
    的头像 发表于 10-13 10:27 4171次阅读

    仿生微型机器人来了 用光弯曲混合水凝胶致机器人行走

    用光弯曲混合水凝胶致机器人行走。 图片来源:《科学机器人》网站 据最新一期《科学机器人》报道,美国西北大学的研究人员开发出首个类似于生命的材料,可以充当软机器人。它能以人类的速度
    发表于 12-11 19:21 766次阅读

    外骨骼机器人让残障人士重获行走自由

    过去,对于许多残障人士来说,一辈子只能依靠轮椅。现在,外骨骼机器人的出现,改变了下肢瘫痪、行动不便的人几乎无法行走的困境。那么,外骨骼机器人是怎样带动人行走的?又有哪些应用场景?未来发
    的头像 发表于 09-21 10:01 1144次阅读
    外骨骼<b class='flag-5'>机器人</b>让残障人士重获<b class='flag-5'>行走</b>自由