这是一道 「中等难度」 的题 
https://leetcode.cn/problems/walking-robot-simulation


题目

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

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

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

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

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

注意:

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

示例 1:

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{010-1}, []int{10-10}

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

    // 答案
    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
}

复杂度分析

  • 时间复杂度, 其中 为机器人行走的步数, 为障碍物的个数,为转换方向的次数。
  • 空间复杂度, 为障碍物的个数。

END




本篇文章来源于微信公众号: i余数



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2023-06-19