找出从当前位置通过 Python 中的给定点可以到达的点的程序

假设在 2D 空间中,指针位于具有坐标 (px, py) 的点 p。现在指针必须移动到另一个具有坐标 (qx, qy) 的点 q。指针不能自由移动,如果中间有一些点,它可以移动到 q。我们得到了一个包含各种坐标点的点“路径”数组。指针可以移动到从指针当前位置(x+1, y) or (x, y+1) or (x-1, y) or (x, y-1) 的点. 数组“路径”中的给定点必须按顺序连续处理,这意味着即使无法进行移动,数组中的每个点也必须加到总路径中。因此,给定起点和终点,我们必须找出指针是否可以从给定的点到达目的地。如果可以的话 我们打印出它到达目的地所经过的总点数;如果不能,我们打印-1。

所以,如果输入像 px = 1, py = 1, qx = 2, qy = 3, paths = [[1, 2], [0, 1], [0, 2], [1, 3], [3, 3]],则输出为 4。

所以,如果我们连续处理这些点,我们会得到 -

Point (1, 2):进行移动,当前指针位置 (1, 2)。穿越点:1。

Point (0, 1):没有移动,当前指针位置(1, 2)。遍历点数:2。

Point (0, 2):没有移动,当前指针位置(1, 2)。遍历点数:3。

Point (1, 3):进行移动,当前指针位置 (1, 3)。遍历点数:4。

目的地位于距离当前指针位置(x+1,y)处,所以遍历的总点数为4。

示例

让我们看看以下实现以获得更好的理解 -

from collections import deque

def solve(px, py, qx, qy, paths):

   def helper(k):

      vertices = {(px, py), (qx, qy)}

      for x, y in paths[:k]:

         vertices.add((x, y))

      trav = deque([(px, py)])

      while trav:

         x, y = trav.popleft()

         if (x, y) == (qx, qy):

            return True

         for kx, ky in ((x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)):

            if (kx, ky) in vertices:

               trav.append((kx, ky))

               vertices.remove((kx, ky))

      return False

   ll, ul = -1, len(paths) + 1

   while ll + 1 < ul:

      k = ll + (ul - ll) // 2

      if helper(k):

         ul = k

      else:

         ll = k

   return ul if ul <= len(paths) else -1

print(solve(1, 1, 2, 3, [[1, 2],[0, 1],[0, 2],[1, 3],[3, 3]]))

输入

1, 1, 2, 3, [[1, 2],[0, 1],[0, 2],[1, 3],[3, 3]]
输出结果
4

以上是 找出从当前位置通过 Python 中的给定点可以到达的点的程序 的全部内容, 来源链接: utcz.com/z/327366.html

回到顶部