凸包入門之卷包裹法 hdu 1348 wall

2021-07-09 05:10:52 字數 1279 閱讀 1207

在二維空間中,凸包可以簡單的認為是最小的包含所有點的凸多邊形。

簡單的卷包裹法:尋找最邊緣(最下方的,次之是最左邊的;或者最左邊的,次之最下邊)點。假想用一根繩子向右逆時針旋轉碰到另乙個點,這樣新找到的點作為端點,繼續旋轉繩子重複找點的步驟,一直圍成乙個凸多邊形。時間複雜度:o(n^2)     //我把此**和graham-scan比較了一下,沒有理解為什麼他就是 o(n^2) t_t

(如果在尋找的射線上有多個點的情況,使用和保留離前端點最遠的那一點)

因為涉及到旋轉和夾角,所以運用到了叉積。

例子:hdu 1348  wall

大致題意:給出n個點,它所形成的多邊形向外撐長l,新的多邊形的周長是多少?

分析:每對對頂角的和是180度,n多邊形有n個頂點,同時多邊形的內角和是180(n-2),那麼外圍的夾角和就應該是180n-180(n-2)=360

於是得到結論:多邊形的周長+圓的周長就是所求。

#include #include #include #include using namespace std;

struct pointpt[1005];

int sta[1005],ans[1005],cnt;

int cmp(point a,point b)

sta[top++]=i;

}for(int i=0;i=0;i--)

sta[top++]=i;

}for(int i=0;i>t;

while(t--)pt[1005],ans[1005];

int cnt;

int cmp(point a,point b)

ans[cnt++]=pt[i];

}int key=cnt;

//求上凸包 (將pt[n-1]和pt[0]連線起來。)

for(int i=n-2;i>=0;i--)

ans[cnt++]=pt[i];

}}int main()

convex(n);

double res=2*pi*l;

for(int i=0;i

printf("%.0lf\n",res);

if(t) puts("");

}return 0;

}

凸包問題之GrahamScan法

grahamscan法 當沿著convex hull逆時針漫遊時,總是向左轉 在極座標系下按照極角大小排列,然後逆時針方向漫遊點集,去除非conves hull頂點 非左轉點 實現 如下 include include include define max size 10001 struct poi...

凸包之Jarvis步進法

jarvis步進法 概述 也可稱為卷包裹法,思路是先找到乙個在凸包上的點,然後卷過去,由於每次確定凸包上的乙個點需要遍歷所有的點,因此時間複雜度為o n h 其中n為全部點的數目,h為凸包上的點數目 適用性 從時間複雜度可以看出此方法適用點的數目不易過多,建議適用graham掃瞄法 方法和步驟 下述...

BZOJ1209 最佳包裹 (三維凸包 增量法)

求三維凸包的表面積。n 100 n le100 n 100 暴力往當前的凸包裡加點。o n 2 o n 2 o n2 題解詳見大佬部落格 擾動函式sha keshake shak e是為了避免四點共面。實測e ps epsep s開到1e 101e 10 1e 10才過 include using ...