机器人大冒险

力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种:
U: 向y轴正方向移动一格
R: 向x轴正方向移动一格。
不幸的是,在 xy 平面上还有一些障碍物,他们的坐标用obstacles表示。机器人一旦碰到障碍物就会被损毁。给定终点坐标(x, y),返回机器人能否完好地到达终点。如果能,返回true;否则返回false。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/programmable-robot
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一、思路

  1. 第一种
    一开始想法是直接暴力解决,只要计算机计算能力够强,那么就可以直接解决。 不过会出现运行时间超时的提示,所以这种思路行不通,这是由于后面题目含有条件限制:
    1、2 <= command的长度 <= 1000
    2、command由U,R构成,且至少有一个U,至少有一个R
    3、0 <= x <= 1e9, 0 <= y <= 1e9
    4、0 <= obstacles的长度 <= 1000
    5、obstacles[i]不为原点或者终点
  2. 第二种
    问题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。然后进行坐标逼近操作,判断该店是否在机器人路径上。则逼近坐标初始值为(X1
    K,Y1
    K),按照数学推理可知,若果障碍点在路径上,那么它的坐标与逼近点坐标必定只相差一个循环之内,意思就是肯定在以逼近坐标作为初始点进行的下一循环内,必能找到(即是经过)该障碍点。若果没有找到,则表示该障碍点不在机器人的预运动路径上,不影响机器人冒险。
    **第三步:**对每个障碍点进行如上第二步的操作
    **第四步:**当前面所有障碍点都被判断为无影响后,那么就来考虑机器人是否能够到达终点。这一步很简单,换种说法就是,你可以把该终点看做一个障碍点,我们需要判断这个障碍点是否在机器人的运动轨迹上,若果在,则是表明可以到达终点,反之不能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)
``