假设在无限网格上有一个机器人开始于(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