在Python中将一组点分为k个不同组的程序

假设我们有一个点列表和一个数字k。这些点的形式为(x,y),代表笛卡尔坐标。如果两个点p1和p2之间的欧式距离小于等于k,则可以将它们分组,我们必须找到不相交的组的总数。

因此,如果输入像点= [[2,2],[3,3],[4,4],[11,11],[12,12]],k = 2,则输出将为2,因为它可以分为两组:[[2,2],[3,3],[4,4])和([11,11],[12,12])

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个功能dfs()。这需要我

  • 如果我在里面,那么

    • dfs(nb)

    • 从主要方法,请执行以下操作-

    • adj:=映射

    • n:=点的大小

    • 对于0到n范围内的j,执行

    • 看过:=一套新的

    • 回答:= 0

    • 对于0到n范围内的i,执行

    • 返回ans

    • p1:=分[i]

    • p2:=分[j]

    • 如果p1和p2之间的欧几里得距离<k,则

    • 在adj [i]的末尾插入j

    • 在adj [j]的末尾插入i

    • 对于0到j范围内的i,执行

    • ans:= ans + 1

    • dfs(i)

    • 如果我没看到,那

    • 返回

    • 将我插入看到

    • 对于adj [i]中的每个nb,执行

    让我们看下面的实现以更好地理解-

    示例

    from collections import defaultdict
    class Solution:
       def solve(self, points, k):
          adj = defaultdict(list)
    
          n = len(points)
          for j in range(n):
             for i in range(j):
                x1, y1 = points[i]
                x2, y2 = points[j]
                if (x1 - x2) ** 2 + (y1 - y2) ** 2 <= k ** 2:
                   adj[i].append(j)
                   adj[j].append(i)
    
          seen = set()      def dfs(i):
             if i in seen:
                return
             seen.add(i)
             for nb in adj[i]:
                dfs(nb)
    
          ans = 0
          for i in range(n):
             if i not in seen:
                ans += 1
                dfs(i)
          return ans
    ob = Solution()points = [
    [2, 2],
    [3, 3],
    [4, 4],
    [11, 11],
    [12, 12]
    ]
    k = 2
    print(ob.solve(points, k))

    输入值

    [[2, 2],[3, 3],[4, 4],[11, 11],[12, 12]],2

    输出结果

    2
    猜你喜欢