Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 포인트 세트를 k개의 다른 그룹으로 그룹화하는 프로그램

<시간/>

포인트 목록과 숫자 k가 있다고 가정합니다. 점은 데카르트 좌표를 나타내는 (x, y) 형식입니다. 두 점 p1과 p2 사이의 유클리드 거리가 <=k이면 임의의 두 점 p1과 p2를 그룹화할 수 있으므로 분리된 그룹의 총 수를 찾아야 합니다.

따라서 입력이 포인트 =[[2, 2],[3, 3],[4, 4],[11, 11],[12, 12]], k =2인 경우 출력은 다음과 같습니다. 2, ([2,2],[3,3],[4,4]) 및 ([11,11],[12,12])의 두 그룹을 만들 수 있으므로

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • dfs() 함수를 정의합니다. 이 시간이 걸립니다

  • 내가 본다면

    • 반환

    • 본에 i 삽입

    • adj[i]의 각 nb에 대해 수행

      • dfs(nb)

      • 기본 방법에서 다음을 수행하십시오-

      • adj :=지도

      • n :=포인트 크기

      • 0에서 n 사이의 j에 대해 수행

        • 범위 0에서 j에 있는 i에 대해 수행

          • p1 :=포인트[i]

          • p2 :=포인트[j]

          • p1과 p2 사이의 유클리드 거리

            • adj[i]

              끝에 j 삽입
            • adj[j]

              끝에 i 삽입
      • 본 :=새로운 세트

      • 답변 :=0

      • 0에서 n 사이의 i에 대해 수행

        • 내가 본 적이 없다면

          • ans :=ans + 1

          • dfs(i)

      • 반환

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

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