leetcode-874. 模拟行走机器人---python
Posted 大聪明Smart
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode-874. 模拟行走机器人---python相关的知识,希望对你有一定的参考价值。
874. 模拟行走机器人
难度中等154收藏分享切换为英文接收动态反馈
机器人在一个无限大小的 XY 网格平面上行走,从点 (0, 0)
处开始出发,面向北方。该机器人可以接收以下三种类型的命令 commands
:
-2
:向左转90
度-1
:向右转90
度1 <= x <= 9
:向前移动x
个单位长度
在网格上有一些格子被视为障碍物 obstacles
。第 i
个障碍物位于网格点 obstacles[i] = (xi, yi)
。
机器人无法走到障碍物上,它将会停留在障碍物的前一个网格方块上,但仍然可以继续尝试进行该路线的其余部分。
返回从原点到机器人所有经过的路径点(坐标为整数)的最大欧式距离的平方。(即,如果距离为 5
,则返回 25
)
注意:
- 北表示
+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 <= commands.length <= 104
commands[i]
is one of the values in the list[-2,-1,1,2,3,4,5,6,7,8,9]
.0 <= obstacles.length <= 104
-3 * 104 <= xi, yi <= 3 * 104
- 答案保证小于
231
直接对commands数组遍历命令,循环判断三种情况:左转、右转、行走,一个变量ans记录距离最大值。
卡住我的一个地方就转向怎么处理,说明东西南北四个放向好处理,直接一个方向数组搞定。依据当前方向进行转向的方法是:
两个数组和一个方向控制变量:
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
di = 0
左转即为:di = (di - 1) % 4
,右转即为:di = (di + 1) % 4
了解了这个转向,下边就简单啦,
完整代码:
class Solution:
def robotSim(self, commands: List[int], obstacles: List[List[int]]) -> int:
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
x = y = ans = di = 0
# 把列表转为集合,可以加快搜寻速度
obstacles = set(map(tuple, obstacles))
for cmd in commands:
if cmd == -1:
# right
di = (di + 1) % 4
elif cmd == -2:
# left
di = (di - 1) % 4
else:
for i in range(cmd):
if (x+dx[di], y+dy[di]) not in obstacles:
x += dx[di]
y += dy[di]
ans = max(ans, x**2+y**2)
return ans
以上是关于leetcode-874. 模拟行走机器人---python的主要内容,如果未能解决你的问题,请参考以下文章
leetcode-874. 模拟行走机器人---python
leetcode-874. 模拟行走机器人---python
leetcode-874. 模拟行走机器人---python