【LeetCode LCP 3】机器人大冒险

题目链接:

思路:

参考https://leetcode-cn.com/problems/programmable-robot/solution/jian-dan-fang-fa-wu-hash-by-asver0521/

题目要求返回是否完好到达终点,而终点(x,y)0 <= x <= 1e9, 0 <= y <= 1e9,所以暴力算路径会超时。
所幸在于指令command是一种循环,实际上每一层循环的坐标都是第一次循环UR数量的倍数加上基础坐标
这样就可以求得,只要任何一个obstacle在路径上,就可以输出false
所以只用匹配每个obstacle是否在循环路径中。
变成了一道初中数学问题。
xn = nx + x1
yn = ny + y1
反向求解即可

def robot(self, command: str, obstacles: List[List[int]], x: int, y: int) -> bool:
    a, b = 0, 0
    path = [[0,0]]

    #第一次循环的路径,作为基础坐标(x1, y1)
    for v in command:
        if v == "U":
            b += 1
        else:
            a += 1
        path.append([a, b])

    #判断终点是否能到达
    if [x % path[-1][0] , y - ((x // path[-1][0]) * path[-1][1])] not in path:
        return False
    
    #判断ob在终点范围以内,再判断是否在循环路径中
    for ob in obstacles:
        if ob[0] <= x and ob[1] <= y:
            if [ob[0] % path[-1][0] , ob[1] - ((ob[0] // path[-1][0]) * path[-1][1])] in path:
                return False
    return True

**************************************************************************************************************************************

按照我一开始的思路用回溯法去做会超时。

回溯:

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
        """
        return self.FindPath(command, obstacles, x, y, 0, 0, 0)
        
    def FindPath(self,command, obstacles, x, y, i, j, k):
        if i == x and j == y:
            return True
        if obstacles and [i,j] in obstacles:
            return False
        if k >= len(command):
            k = 0
        if command[k] == 'U':
            nxt = self.FindPath(command, obstacles, x, y, i, j+1, k+1)
        elif command[k] == 'R':
            nxt = self.FindPath(command, obstacles, x, y, i+1, j, k+1)
        return nxt

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值