分治法 凸包問題

2022-06-18 16:42:13 字數 1548 閱讀 1998

什麼是凸包?

我的理解就是,圖形任意兩點的連線都沒有在圖形外部。

問題:給定點集,怎麼求出凸包的邊界點呢???

第一步:給這些點按照x的從大到小進行排序,如果x相同的按照y再排序。

第二步:把x最小的和最大的連起來,他們必為凸包的邊界點。

第三步:把平面區域分為兩個部分,分別在上面和下面去找面積最大的三角形(面積最大包括的點也就越多嘛,所以適合當凸包的邊界點)

那面積怎麼求呢?

求三角形的面積,假設三個點,a(x1,y1),b(x2,y2), c(x3,y3),以下行列式對於平面上任意三角形, 求解面積都很方便, 所得結果是三角形abc面積的兩倍,a->b->c為順時針順序時,該值為正,,反之則為負。

第四步:進行遞迴,把三角形左邊那個邊作為底邊又去找面積最大的三角形,同理右邊,下面也一樣。

上**!!!

#include using namespace std;

#include #include #define n 10000

int n = 0;

struct point

p[n],ans[n];

int visit[n],mark[n];

int djudge(point a1, point a2, point a3)

bool cmpxy(const point a, const point b) //按x軸排序,如果x相同,按y軸排序

void dealleft(int first, int last)

// if (calcu > max)}}

else

//if (calcu > max)}}

if (index != -1)

} int main()

visit[0] = 1;

visit[n - 1] = 1;

sort(p, p + n, cmpxy);

dealleft(0, n - 1); //查詢上凸包;

dealleft(n - 1, 0); //查詢下凸包;

int t = 0;

for (int i = 0; i < n; i++)

}//順時針輸出

mark[0] = mark[t - 1] = 1; //陣列mark避免重複檢查降低效率

for (int i = 1; i < t - 1; i++)

cout<

}cout << ans[t - 1].x << " " << ans[t - 1].y << endl;

for (int i = 1; i < t; i++)}}

return 0;

}

凸包問題之分治法

凸包 按橫座標排序,以最小點與最大點之間的連線為準,在直線一側找使三角形面積最大的點,此點必在凸包內,以找到點與最大點或最小點繼續遞迴以尋找最大三角形面積尋找凸包點,直至找不到符合條件的點。實現 如下 include include include define max size 10001 str...

分治法解決凸包問題

問題 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,凸包問題是為集合s構造最小凸多邊形。思路設p1 x1,y1 p2 x2,y2 pn xn,yn 按照x軸座標公升序排列,則最左邊的點p1和最右邊的點p2一定是該集合的凸包頂點。如圖1所示。設p1pn是經過點p1...

凸包問題 (用分治演算法)

問題描述 在平面上有n個點,其中任何三個點都不在一條直線上,問如何尋找乙個點集,使得這些點構成的多邊形剛好能把所有點都包進。基本思想 我們採用分治演算法。首先算出這n個點的橫座標中位數,記為x0,畫出直線x x0,將整個平面分成兩部分。我們要做的就是分別求兩部分的凸包,最後再合併即可。利用分治和遞迴...