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

ค้นหาพื้นที่ขั้นต่ำของสี่เหลี่ยมด้วยชุดพิกัดที่กำหนดใน C++


สมมติว่าเรามีอาร์เรย์ของบางจุดในระนาบ XY เราต้องหาพื้นที่ต่ำสุดของสี่เหลี่ยมที่สามารถสร้างได้จากจุดเหล่านี้ ด้านข้างของสี่เหลี่ยมผืนผ้าควรขนานกับแกน X และ Y หากเราไม่สามารถสร้างสี่เหลี่ยมผืนผ้าได้ ให้คืนค่า 0 ดังนั้นหากอาร์เรย์ของจุดเป็น [(1, 1), (1, 3), (3, 1), (3, 3), (2, 2)] . ผลลัพธ์จะเป็น 4 เนื่องจากสามารถสร้างสี่เหลี่ยมผืนผ้าได้โดยใช้จุด (1, 1), (1, 3), (3, 1) และ (3, 3)

ในการแก้ปัญหานี้ ให้กำหนดจุดด้วยพิกัด x เพื่อที่จุดบนเส้นแนวตั้งที่เป็นเส้นตรงจะถูกจัดกลุ่มเข้าด้วยกัน จากนั้นสำหรับแต่ละคู่ของจุดในกลุ่ม เช่น (x, y1) และ (x, y2) เราจะพบสี่เหลี่ยมที่เล็กที่สุดที่มีจุดคู่นี้ เป็นขอบขวาสุดของสี่เหลี่ยมที่จะสร้าง เราสามารถทำได้โดยการติดตามจุดคู่อื่น ๆ ทั้งหมดที่เราเคยไปมาก่อน สุดท้ายให้คืนค่าพื้นที่ต่ำสุดที่เป็นไปได้ของสี่เหลี่ยมผืนผ้าที่ได้รับ

ตัวอย่าง

import collections
def findMinArea(Arr):
   columns = collections.defaultdict(list)
   for x, y in Arr:
      columns[x].append(y)
   lastx = {}
   ans = float('inf')
   for x in sorted(columns):
      col = columns[x]
      col.sort()
      for j, y2 in enumerate(col):
         for i in range(j):
            y1 = col[i]
   if (y1, y2) in lastx:
      ans = min(ans, (x - lastx[y1, y2]) * (y2 - y1))
      lastx[y1, y2] = x
   if ans < float('inf'):
      return ans
   else:
      return 0
A = [[1, 1], [1, 3], [3, 1], [3, 3], [2, 2]]
print('Minimum area of rectangle:',findMinArea(A))

ผลลัพธ์

Minimum area of rectangle: 4