【leetcode】LCP 3. Programmable Robot

题目如下:

力扣团队买了一个可编程机器人,机器人初始位置在原点(0, 0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种:

U: 向y轴正方向移动一格
R: 向x轴正方向移动一格。
不幸的是,在 xy 平面上还有一些障碍物,他们的坐标用obstacles表示。机器人一旦碰到障碍物就会被损毁。

给定终点坐标(x, y),返回机器人能否完好地到达终点。如果能,返回true;否则返回false。

示例 1:

输入:command = "URR", obstacles = [], x = 3, y = 2
输出:true
解释:U(0, 1) -> R(1, 1) -> R(2, 1) -> U(2, 2) -> R(3, 2)。
示例 2:

输入:command = "URR", obstacles = [[2, 2]], x = 3, y = 2
输出:false
解释:机器人在到达终点前会碰到(2, 2)的障碍物。
示例 3:

输入:command = "URR", obstacles = [[4, 2]], x = 3, y = 2
输出:true
解释:到达终点后,再碰到障碍物也不影响返回结果。
 

限制:

2 <= command的长度 <= 1000
command由U,R构成,且至少有一个U,至少有一个R
0 <= x <= 1e9, 0 <= y <= 1e9
0 <= obstacles的长度 <= 1000
obstacles[i]不为原点或者终点

解题思路:机器人的轨迹是有规律的。首先可以分别求出command中U和R的数量,然后遍历一次command,记录机器人运行时候经过的坐标。假如其中有一个坐标为(x1,y1),那么这个点接下来的轨迹满足 x1 = x1*r_count*n, y 1 = y1*u_count*n,n为正整数。所以只需要判断obstacles是否满足上面的方程即可。最后要注意的一点是也要判断终点是否满足这个方程,如果不满足说明从起点开始,即使没遇到任何障碍也无法到达终点。

代码如下:

class Solution(object):
    def robot(self, command, obstacles, x, y):
        """
        :type command: str
        :type obstacles: List[List[int]]
        :type x: int
        :type y: int
        :rtype: bool
        """
        u_count = command.count('U')
        r_count = command.count('R')
        path = [[0,0]]
        cx,cy = 0,0
        for c in command:
            if c == 'U':cy += 1
            else: cx += 1
            path.append([cx,cy])
        for (ox,oy) in obstacles:
            if ox > x or oy > y:continue
            for (px,py) in path:
                if (ox - px) % r_count == 0 and (oy - py) % u_count == 0 and (ox - px) / r_count  == (oy - py) / u_count :
                    return False

        #check can reach exit
        for (px, py) in path:
            if (x - px) % r_count == 0 and (y - py) % u_count == 0 and (x - px) / r_count == (y - py) / u_count:
                return True

        return False
原文地址:https://www.cnblogs.com/seyjs/p/11605022.html