假设在无限网格上有一个机器人开始于(0,0)点。它朝北。现在,机器人可以接收三种可能的命令之一-
-2向左转90度
-1向右转90度
从1到9的任何值向前移动x个单位
有一些网格正方形是障碍。
我们还有另一个称为障碍物的数组,它表示第i个障碍物位于网格点(障碍物[i] [0],障碍物[i] [1]),如果机器人要移动到它们上,则机器人会停留在而不是以前的网格正方形。
我们必须找到机器人距原点的最大欧几里得距离的平方。
因此,如果输入像命令= [4,-1,4,-2,4],障碍物= [[2,4]],则输出将为65,因为机器人将卡在(1、4 ),然后向左转到(1,8)。
为了解决这个问题,我们将遵循以下步骤-
position_offset:= [(0,1),(1,0),(0,-1),(-1,0)]
将x,y,方向,max_distance初始化为0
对于命令中的每个命令,执行
如果(x + x_off,y + y_off)不在障碍物中,则
命令:=命令-1
x:= x + x_off
y:= y + y_off
(x_off,y_off):= position_offset [方向]
方向:=(方向+1)mod 4
方向:=(方向-1)mod 4
如果命令与-2相同,则
否则,当命令与-1相同时,则
除此以外,
当命令非零时,执行
max_distance = max_distance的最大值,x ^ 2 + y ^ 2
返回max_distance
让我们看下面的实现以更好地理解-
class Solution: def robotSim(self, commands, obstacles): position_offset = [(0, 1), (1, 0), (0, -1), (-1, 0)] obstacles = set(map(tuple, obstacles)) x, y, direction, max_distance = 0, 0, 0, 0 for command in commands: if command == -2: direction = (direction - 1) % 4 elif command == -1: direction = (direction + 1) % 4 else: x_off, y_off = position_offset[direction] while command: if (x + x_off, y + y_off) not in obstacles: x += x_off y += y_off command -= 1 max_distance = max(max_distance, x**2 + y**2) return max_distance ob = Solution()print(ob.robotSim([4,-1,4,-2,4],[[2,4]]))
[4,-1,4,-2,4],[[2,4]]
输出结果
65