机器人大冒险
力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种:
U: 向y轴正方向移动一格
R: 向x轴正方向移动一格。
不幸的是,在 xy 平面上还有一些障碍物,他们的坐标用obstacles表示。机器人一旦碰到障碍物就会被损毁。给定终点坐标(x, y),返回机器人能否完好地到达终点。如果能,返回true;否则返回false。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/programmable-robot
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一、思路
- 第一种
一开始想法是直接暴力解决,只要计算机计算能力够强,那么就可以直接解决。 不过会出现运行时间超时的提示,所以这种思路行不通,这是由于后面题目含有条件限制:
1、2 <= command的长度 <= 1000
2、command由U,R构成,且至少有一个U,至少有一个R
3、0 <= x <= 1e9, 0 <= y <= 1e9
4、0 <= obstacles的长度 <= 1000
5、obstacles[i]不为原点或者终点 - 第二种
问题1:机器人是否会遇到障碍点,即是障碍点在不在机器人的运动路径上?
问题2:机器人能不能到达指定终点?
即是先判断已有的障碍点是不是在机器人经过的路径上,若障碍点坐标X0>X or Y0>Y时候,则这个障碍点可忽略不考略;若障碍点X0<=X and Y0<=Y时候,则必须考虑机器人的路径是否要经过此点。判断方法如下:
第一步:**获取机器人在循环一次完整指令时的坐标(X1,Y1)
第二步:取得某个障碍点坐标(X0,Y0),K = min(X0//X1,Y0//Y1),即是得到需要指令循环的最少次数。如一次循环后坐标为(2,1),障碍点为(51,46),K=2。然后进行坐标逼近操作,判断该店是否在机器人路径上。则逼近坐标初始值为(X1K,Y1K),按照数学推理可知,若果障碍点在路径上,那么它的坐标与逼近点坐标必定只相差一个循环之内,意思就是肯定在以逼近坐标作为初始点进行的下一循环内,必能找到(即是经过)该障碍点。若果没有找到,则表示该障碍点不在机器人的预运动路径上,不影响机器人冒险。
**第三步:**对每个障碍点进行如上第二步的操作
**第四步:**当前面所有障碍点都被判断为无影响后,那么就来考虑机器人是否能够到达终点。这一步很简单,换种说法就是,你可以把该终点看做一个障碍点,我们需要判断这个障碍点是否在机器人的运动轨迹上,若果在,则是表明可以到达终点,反之不能false。处理方法具体与第二步大体相同。
具体代码
# -*- coding: utf-8 -*-
# /usr/bin/python
# 作者:kimicr
# 实验日期:201901020
# Python版本:3.6.3
class Solution(object):
def __init__(self):
pass
def robot(command: str, obstacles: list, x: int, y: int) -> bool:
def One(command):
# 得到一次循环指令的坐标
x1, y1 = 0, 0
for i in command:
if i == "U":
y1 += 1
else:
x1 += 1
return x1, y1
def obstacles_func(obs): # 判断单个障碍点
x1, y1 = One(command) # 得到经过一次循环的坐标
mi = min(obs[0] // x1, obs[1] // y1) # 得到大致经过此点的循环数
x1, y1 = x1 * mi, y1 * mi
# 由于//是向下取整数,所以x1,y1 <= x,y,即是在下一轮中就可判断该障碍点是否会被经过
for i in command:
if [x1, y1] == obs: # 说明必将经过障碍点
return 'yes'
elif i == "U":
y1 += 1
else:
x1 += 1
return 'no' # 说明不会经过该障碍点
# 如果有障碍则先判断机器人路径经过障碍点否
def panduan(obstacles): # 判断所有障碍点
for i in obstacles:
if i[0] > x or i[1] >y:
pass
else:
value = obstacles_func(i)
if value == "yes":
return False
return True
result = panduan(obstacles)
if not result:
return False
elif result:
ret = obstacles_func([x, y])
if ret == "yes":
return True
else:
return False
if __name__ == "__main__":
res = Solution.robot(command="URR",obstacles=[[2,2]],x=3,y=2)
print(res)
``