Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมจัดกลุ่มชุดจุดเป็น k กลุ่มต่างๆ ใน ​​Python


สมมติว่าเรามีรายการคะแนนและจำนวน 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() นี่จะใช้เวลาฉัน

  • ถ้าฉันอยู่ในสายตาแล้ว

    • กลับ

    • ใส่ฉันเข้าไปในที่เห็น

    • สำหรับแต่ละ nb ใน adj[i] ทำ

      • dfs(nb)

      • จากวิธีหลัก ให้ทำดังนี้−

      • adj :=แผนที่

      • n :=ขนาดของคะแนน

      • สำหรับ j ในช่วง 0 ถึง n ทำ

        • สำหรับผมอยู่ในช่วง 0 ถึง j ทำ

          • p1 :=คะแนน[i]

          • p2 :=คะแนน[j]

          • ถ้าระยะห่างระหว่าง p1 และ p2

            • ใส่ j ต่อท้าย adj[i]

            • ใส่ i ต่อท้าย adj[j]

      • เห็นแล้ว :=ชุดใหม่

      • ตอบ :=0

      • สำหรับผมอยู่ในช่วง 0 ถึง n ทำ

        • ถ้าฉันไม่เห็นแล้ว

          • 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