先解釋一下:這兩個演算法分別都是凸包問題的演算法,然後andrew是graham的變種,速度更快,更穩定,非常優秀,介於我已經把graham寫的莫名其妙的wa了,所以我選擇了這種演算法!
凸包:給你n個散落的點,讓你求出最小的凸多邊形將所有的點包括起來,或者點在邊上。用到的演算法是graham或andrew!
first
首先先按照x座標大小或y座標大小進行排序(如果x座標一樣,y座標就從小到大排序或如果y座標一樣那麼x座標就從小到大排序)
second
然後進入程式的主幹部分,先說一下andrew主幹的大體思路,我們分兩次來求這個凸包,先從左到右一遍,再從右到左一遍(或先從下到上一遍,再從上到下一遍)首先我們一定要明白第n-1個點一定會在第一遍時進入凸包棧內(看了上面鏈結的朋友都應該知道這個棧是如何操作的,這裡不再贅述)(因為n個點是從0n-1),所以第二遍的時候不必從n-1開始,從n-20開始就可以了(**上會有體現)然後就完了!
現在我們來詳細講一下如何實現second的操作
我們要實現找凸包,那麼就必須找到最外層的點,這裡就要使用叉積進行判斷(向量a叉向量b=a.x×b.y-b.x×a.y)如果為正a在b的右邊反之在左邊(題目中因為我們只能定義乙個基準座標系,所以為了實現這個功能我們就必須找參照點,參照點作為臨時原點)**中xmult會體現。
然後就差不多了!
下面就是**了:
#include#include#include#includeusing namespace std;
struct point;
bool cmp(point a,point b)
point node[100005];
int num[100005];
int n;
int main()
int basic=top;
for(int i=n-2;i>=0;--i)
double s;
s=0.0;
for(int i=1;i<=top;++i)
printf("%.1lf",s);
return 0;
}
凸包 Andrew演算法
凸包的定義如下 在乙個點集d中,按一定順序選取子集q 使得q中所有點順次連線所構成的封閉凸多邊形包住d中所有點 可以形象地理解為 有許多個釘子釘在平面上,用一根牛皮筋把所有點包住 如下圖 andrew演算法是graham演算法的變種。其主要思想為把凸包上的點依次放入棧中,如果發現形成了凹多邊形 叉積...
凸包(Andrew演算法)模板
andrew演算法是graham的變種,相較graham,其更快,數值穩定性更好。藍書 struct nodep maxn ch maxn bool cmp node a,node b int cross node p0,node p1,node p2 凸包邊上可以有點,則 否則 int conve...
Andrew 演算法(構造凸包)
這是乙個基 graham 思想的又乙個演算法,我個人認為其中複雜度的改進應該是在 sort 的 cmp 部分吧,graham 的 cmp 部分需要對兩個點算出叉乘,甚至在某些情況還要算出兩個點的距離,這一步驟應該相對而言複雜度是較高的。而 andrew 很好的避免了這一步驟,直接通過對點的 x,y ...