Walking Robot Simulation

模拟行走机器人

题目描述

机器人在一个无限大的网格上行走,从点(0, 0)出发,面向北方。

机器人接受三种类型指令:

  • -2:向左转 90 度

  • -1:向右转 90 度

  • 1 <= x <= 9:向前移动 x 个单位长度

在网格上,有一些格子会被视为障碍物。机器人遇到障碍物会停下来,等待接受下一个指令。

请返回从原点到机器人经过的路径点的最大距离平方。

示例1:

输入: commands = [4,-1,3], obstacles = []
输出: 25
解释: 机器人将会到达 (3, 4)

示例2:

输入: commands = [4,-1,4,-2,4], obstacles = [[2,4]]
输出: 65
解释: 机器人在左转走到 (1, 8) 之前将被困在 (1, 4) 处

解法

解法一:这种解法具体归类为什么思想我也不清楚。

  • 时间复杂度:O(N + K),N、K分别代表commandsobstacles的长度

  • 空间复杂度:O(K)

func robotSim(commands []int, obstacles [][]int) int {
    obstacleM := map[int]struct{}{}
    for _, pos := range obstacles {
        tmp := pos[0] << 16 + pos[1]
        obstacleM[tmp] = struct{}{}
    }
    dx := []int{0, 1, 0, -1}
    dy := []int{1, 0, -1, 0}
    x, y, di := 0, 0, 0

    maxDis := 0
    for _, num := range commands {
        if num == -1 {
            di = (di + 1) % 4
        } else if num == -2 {
            di = (di + 3) % 4
        } else {
            for i := 0; i < num; i++ {
                nx := x + dx[di]
                ny := y + dy[di]
                tmp := nx << 16 + ny
                if _, ok := obstacleM[tmp]; ok {
                    break
                }
                x, y = nx, ny
            }
            dis := x*x + y*y
            if dis > maxDis {
                maxDis = dis
            }
        }
    }
    return maxDis
}

Last updated

Was this helpful?