这是一道 「中等难度」 的题 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{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
}
复杂度分析
-
时间复杂度:, 其中 为机器人行走的步数, 为障碍物的个数,为转换方向的次数。 -
空间复杂度:, 为障碍物的个数。


END


本篇文章来源于微信公众号: i余数
微信扫描下方的二维码阅读本文

Comments NOTHING