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

ค้นหา Simple Closed Path สำหรับชุดของคะแนนที่กำหนดใน C++


พิจารณาว่าเรามีชุดของคะแนน เราต้องหาทางปิดง่ายๆ ครอบคลุมทุกจุด สมมติว่าจุดต่างๆ อยู่ด้านล่าง และภาพถัดไปกำลังสร้างเส้นทางปิดบนจุดเหล่านั้น

ค้นหา Simple Closed Path สำหรับชุดของคะแนนที่กำหนดใน C++

เพื่อให้ได้เส้นทาง เราต้องทำตามขั้นตอนเหล่านี้ -

  • หาจุดล่างซ้ายเป็น P

  • จัดเรียง n อื่น ๆ – 1 จุดตามมุมขั้วทวนเข็มนาฬิการอบ ๆ P หากมุมขั้วของจุดสองจุดเหมือนกัน ให้ใส่ไว้เนื่องจากระยะทางสั้นที่สุด

  • สำรวจรายการจุดที่เรียงลำดับแล้วสร้างเส้นทาง

ตัวอย่าง

#include ใช้เนมสเปซ std;class Point { สาธารณะ:int x, y;};Point p0;int euclid_dist (Point p1, Point p2) { ผลตอบแทน (p1.x - p2.x )*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y);}การวางแนว int (จุด p1 จุด p2 จุด p3) { int val =( p2.y - p1.y) * (p3.x - p2.x) - (p2.x - p1.x) * (p3.y - p2.y); ถ้า (val ==0) คืนค่า 0; // colinear return (ค่า> 0)? 1:2; // ตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา} เปรียบเทียบ int (const void * vp1, const void *vp2) { จุด *p1 =(จุด *) vp1; จุด *p2 =(จุด *)vp2; int o =การวางแนว(p0, *p1, *p2); ถ้า (o ==0) ส่งคืน (euclid_dist(p0, *p2)>=euclid_dist(p0, *p1))? -1 :1; ผลตอบแทน (o ==2)? -1:1;} เป็นโมฆะ findClosedPath (คะแนนพอยต์ [], int n) { int y_min =คะแนน[0].y, ขั้นต่ำ =0; สำหรับ (int i =1; i  

ผลลัพธ์

<ก่อนหน้า>(0, 0), (3, 1), (1, 1), (2, 2), (3, 3), (4, 4), (1, 2), (0, 3) ,