0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

模擬機(jī)器人行走

冬至子 ? 來(lái)源:i余數(shù) ? 作者:i余數(shù) ? 2023-06-07 17:01 ? 次閱讀

機(jī)器人在一個(gè)無(wú)限大小的 XY 網(wǎng)格平面上行走,從點(diǎn) 處開(kāi)始出發(fā),面向北方。該機(jī)器人可以接收以下三種類(lèi)型的命令 :

  • :向左轉(zhuǎn) 度
  • :向右轉(zhuǎn) 度
  • :向前移動(dòng) 個(gè)單位長(zhǎng)度

在網(wǎng)格上有一些格子被視為障礙物 。第 i 個(gè)障礙物位于網(wǎng)格點(diǎn) 。

機(jī)器人無(wú)法走到障礙物上,它將會(huì)停留在障礙物的前一個(gè)網(wǎng)格方塊上,但仍然可以繼續(xù)嘗試進(jìn)行該路線(xiàn)的其余部分。

返回從原點(diǎn)到機(jī)器人所有經(jīng)過(guò)的路徑點(diǎn)(坐標(biāo)為整數(shù))的最大歐式距離的平方。(即,如果距離為 ,則返回 )

注意:

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

示例 1:

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

輸出:25

解釋?zhuān)?機(jī)器人開(kāi)始位于 (0, 0):

  1. 向北移動(dòng) 4 個(gè)單位,到達(dá) (0, 4)
  2. 右轉(zhuǎn)
  3. 向東移動(dòng) 3 個(gè)單位,到達(dá) (3, 4) 距離原點(diǎn)最遠(yuǎn)的是 (3, 4) ,距離為 32 + 42 = 25

示例 2:

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

輸出:65

解釋?zhuān)簷C(jī)器人開(kāi)始位于 (0, 0):

  1. 向北移動(dòng) 4 個(gè)單位,到達(dá) (0, 4)
  2. 右轉(zhuǎn)
  3. 向東移動(dòng) 1 個(gè)單位,然后被位于 (2, 4) 的障礙物阻擋,機(jī)器人停在 (1, 4)
  4. 左轉(zhuǎn)
  5. 向北走 4 個(gè)單位,到達(dá) (1, 8) 距離原點(diǎn)最遠(yuǎn)的是 (1, 8) ,距離為 12 + 82 = 65

提示:

1.jpg

題解思路

1.jpg

如示例2圖示:

1.jpg

代碼實(shí)現(xiàn)的難點(diǎn)在于方向的切換,這一類(lèi)題目我們統(tǒng)一采用 「方向數(shù)組」 來(lái)處理。

我們定義當(dāng)前方向?yàn)?code>dir,可取值為 {0,1,2,3};分別代表 {北,東,南,西}。見(jiàn)上圖。

那么當(dāng)機(jī)器人遇到改變方向的命令時(shí),我們直接修改dir的值即可:

1.jpg

然后再分別在 xy 兩個(gè)方向上定義兩個(gè)方向數(shù)組,以Java為例:

int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
  1. 方向?yàn)?code>北(0)時(shí):每次前進(jìn) x 不變,y 加一。
  2. 方向?yàn)?code>東(1)時(shí):每次前進(jìn) x 加一,y 不變。
  3. 方向?yàn)?code>南(2)時(shí):每次前進(jìn) x 不變,y 減一。
  4. 方向?yàn)?code>西(3)時(shí):每次前進(jìn) x 減一,y 不變。

1.jpg

代碼實(shí)現(xiàn)

Java

class Solution {

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

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

        genObstacleSet(obstacles);

        // 當(dāng)前方向,北:0, 東:1,南:2, 西:3
        int dir = 0;

        // 方向數(shù)組
        int[] dx = {0, 1, 0, -1};
        int[] dy = {1, 0, -1, 0};

        // 機(jī)器人位置
        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++){
                // 如果遇到障礙物,停止在當(dāng)前位置
                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 {

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

    // 當(dāng)前方向
    dir := 0

    // 方向數(shù)組
    dx, dy := []int{0, 1, 0, -1}, []int{1, 0, -1, 0}

    // 當(dāng)前位置
    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
}

復(fù)雜度分析

1.jpg

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 機(jī)器人
    +關(guān)注

    關(guān)注

    210

    文章

    28003

    瀏覽量

    205572
  • 變換器
    +關(guān)注

    關(guān)注

    17

    文章

    2081

    瀏覽量

    109030
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2947

    瀏覽量

    104373
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    單足機(jī)器人行走

    `<p><strong>項(xiàng)目說(shuō)明:</strong>該項(xiàng)目使用單片機(jī)為控制核心完成對(duì)單足機(jī)器人站立,行走的控制
    發(fā)表于 10-24 19:02

    中國(guó)工業(yè)機(jī)器人行業(yè)發(fā)展和未來(lái)趨勢(shì)分析

    了3個(gè)階段:70年代的萌芽期,80年代的開(kāi)發(fā)期和90年代的適用化期。當(dāng)今工業(yè)機(jī)器人技術(shù)正逐漸向著具有行走能力、具有多種感知能力、具有較強(qiáng)的對(duì)作業(yè)環(huán)境的自適應(yīng)能力的方向發(fā)展。當(dāng)前,對(duì)全球機(jī)器人技術(shù)的發(fā)展
    發(fā)表于 04-25 16:45

    【mBot申請(qǐng)】雙足行走機(jī)器人設(shè)計(jì)

    ,各個(gè)傳感器模塊之間的聯(lián)系。項(xiàng)目描述:雙足行走機(jī)器人主要功能實(shí)現(xiàn)了機(jī)器人行走,周?chē)h(huán)境溫度、濕度等數(shù)據(jù)的檢測(cè)和實(shí)時(shí)畫(huà)面的傳輸,機(jī)器人行走
    發(fā)表于 11-30 15:57

    企鵝機(jī)器人是怎么樣的?

    企鵝機(jī)器人由BS2控制器控制兩個(gè)角度舵機(jī)實(shí)現(xiàn)模擬企鵝的行走,包括前進(jìn),后退與轉(zhuǎn)向,同時(shí)還可以控制另外兩個(gè)角度舵機(jī)模擬企鵝翅膀的動(dòng)作;語(yǔ)音播放模塊可以發(fā)出企鵝真實(shí)的叫聲。企鵝
    發(fā)表于 03-29 17:29

    機(jī)器人行業(yè),我從哪里入手

    各位大神們好,我是剛畢業(yè)的大學(xué)生。我想進(jìn)入機(jī)器人行業(yè),但不知道從什么地方入手。你們能不能給我指點(diǎn)一下
    發(fā)表于 12-12 18:12

    輔助行走的老人智能攙扶機(jī)器人設(shè)計(jì)

    `現(xiàn)在的社會(huì)狀況,老齡化越來(lái)越大,隨著年紀(jì)的增長(zhǎng),吃飯手抖,行走不方便,這些都是年齡增大都要經(jīng)歷的事情。智能關(guān)注老人生活健康,針對(duì)行動(dòng)不方便,工業(yè)設(shè)計(jì)公司設(shè)計(jì)出了這款老人攙扶機(jī)器人設(shè)計(jì),用來(lái)輔助老人行走
    發(fā)表于 10-12 17:42

    工業(yè)機(jī)器人仿真與編程

    ,歡迎關(guān)注!概述很多時(shí)候由于安裝場(chǎng)地限制的原因,使用ABB機(jī)器人廠商提供的標(biāo)準(zhǔn)行走軸并不能滿(mǎn)足系統(tǒng)集成的需求。這個(gè)時(shí)候就需要自定義設(shè)計(jì)機(jī)器人行走軸,對(duì)機(jī)器人生產(chǎn)線(xiàn)進(jìn)行仿真時(shí)就同樣需要使
    發(fā)表于 09-07 08:57

    自制一個(gè)單獨(dú)行走機(jī)器人

    描述自主機(jī)器人這個(gè)項(xiàng)目是一個(gè)單獨(dú)行走機(jī)器人,奇妙的是它的簡(jiǎn)單和使用很少的組件,它走在一條黑色的“軌道”線(xiàn)上。你會(huì)喜歡的,它很受孩子們歡迎。PCB
    發(fā)表于 07-13 07:30

    基于激光掃描的移動(dòng)機(jī)器人行走環(huán)境直線(xiàn)檢測(cè)_文偉松

    基于激光掃描的移動(dòng)機(jī)器人行走環(huán)境直線(xiàn)檢測(cè)_文偉松
    發(fā)表于 03-19 19:25 ?0次下載

    大型17R“加藤一郎”結(jié)構(gòu)雙足機(jī)器人仿人行走控制研究

    針對(duì)大型17R加藤一郎結(jié)構(gòu)雙足機(jī)器人仿人行走控制問(wèn)題,從仿人機(jī)器人的機(jī)械結(jié)構(gòu)、控制系統(tǒng)、步態(tài)仿真、動(dòng)力學(xué)參數(shù)等方面對(duì)機(jī)器人的影響進(jìn)行了研究,采用仿生學(xué)原理,參考了人體上、下半身比例特點(diǎn)
    發(fā)表于 03-02 15:59 ?1次下載
    大型17R“加藤一郎”結(jié)構(gòu)雙足<b class='flag-5'>機(jī)器人</b>仿<b class='flag-5'>人行走</b>控制研究

    看看一般都有什么連桿機(jī)構(gòu)適于用于機(jī)器人行走

    是由Jansen發(fā)明的,用于模擬平穩(wěn)行走,Jansen利用這種連桿制造了著名的海灘巨獸,這種連桿兼具美學(xué)價(jià)值和技術(shù)優(yōu)勢(shì),通過(guò)簡(jiǎn)單的旋轉(zhuǎn)輸入就可模仿生物行走運(yùn)動(dòng),這種連桿已經(jīng)用于行走
    的頭像 發(fā)表于 07-24 14:50 ?1.4w次閱讀
    看看一般都有什么連桿機(jī)構(gòu)適于用于<b class='flag-5'>機(jī)器人行走</b>的

    雙足行走機(jī)器人步行原理是什么?步態(tài)軌跡規(guī)劃的詳細(xì)分析資料概述

    行走軌跡,使得機(jī)器人行走姿態(tài)更像人類(lèi)的行走.通過(guò)模擬測(cè)試,結(jié)果表明了用三次多項(xiàng)式插值方法是1種規(guī)劃雙足
    發(fā)表于 08-13 08:00 ?101次下載

    用于輔助老人行走/康復(fù)鍛煉的攙扶機(jī)器人

    現(xiàn)在的社會(huì)狀況,老齡化越來(lái)越大,隨著年紀(jì)的增長(zhǎng),吃飯手抖,行走不方便,這些都是年齡增大都要經(jīng)歷的事情。智能關(guān)注老人生活健康,針對(duì)行動(dòng)不方便,工業(yè)設(shè)計(jì)公司設(shè)計(jì)出了這款老人攙扶機(jī)器人設(shè)計(jì),用來(lái)輔助老人行走、康復(fù)鍛煉的智能產(chǎn)品。
    的頭像 發(fā)表于 10-13 10:27 ?4070次閱讀

    仿生微型機(jī)器人來(lái)了 用光彎曲混合水凝膠致機(jī)器人行走

    用光彎曲混合水凝膠致機(jī)器人行走。 圖片來(lái)源:《科學(xué)機(jī)器人》網(wǎng)站 據(jù)最新一期《科學(xué)機(jī)器人》報(bào)道,美國(guó)西北大學(xué)的研究人員開(kāi)發(fā)出首個(gè)類(lèi)似于生命的材料,可以充當(dāng)軟機(jī)器人。它能以人類(lèi)的速度
    發(fā)表于 12-11 19:21 ?743次閱讀

    外骨骼機(jī)器人讓殘障人士重獲行走自由

    過(guò)去,對(duì)于許多殘障人士來(lái)說(shuō),一輩子只能依靠輪椅。現(xiàn)在,外骨骼機(jī)器人的出現(xiàn),改變了下肢癱瘓、行動(dòng)不便的人幾乎無(wú)法行走的困境。那么,外骨骼機(jī)器人是怎樣帶動(dòng)人行走的?又有哪些應(yīng)用場(chǎng)景?未來(lái)發(fā)
    的頭像 發(fā)表于 09-21 10:01 ?1052次閱讀
    外骨骼<b class='flag-5'>機(jī)器人</b>讓殘障人士重獲<b class='flag-5'>行走</b>自由