凸包,格拉漢掃除法

2022-07-21 00:15:18 字數 1409 閱讀 6791

思想的話就不想寫了

有興趣的童鞋詳見《演算法藝術》以及以下的**:

下面給乙個帶註解的**:

program liukee;

type lkj=record

x:double;

y:double;

end;

var a:array[1..10000] of lkj;

s:array[0..10000] of longint;

temp:lkj;

top,i,n:longint;

ans,r:double;

function dis(a,b:lkj):double;

begin

exit(sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));//這裡為了保證精度,必須這麼寫

end;

function calc(a,b,c:lkj):double;//計算向量的叉

var x1,y1,x2,y2:double;

begin

x1:=a.x-c.x;

x2:=b.x-c.x;

y1:=a.y-c.y;

y2:=b.y-c.y;

exit(x1*y2-x2*y1);

end;

procedure qsort(l,r:longint);//對點進行排序

var mid,temp:lkj;

i,j:longint;

begin

i:=l;

j:=r;

mid:=a[(l+r)>>1];//可以隨機化

repeat

while(calc(a[i],mid,a[1])>0)or((calc(a[i],mid,a[1])=0)and(dis(a[i],a[1])dis(mid,a[1])))do dec(j);

if i<=j then

begin

temp:=a[i];

a[i]:=a[j];

a[j]:=temp;

inc(i);

dec(j);

end;

until i>j;

if l1)and(calc(a[i],a[s[top]],a[s[top-1]])>0)do//不用打等於0因為這種共線情況已在之前的排序中處理了

dec(top);

inc(top);

s[top]:=i;

end;

//計算結果

ans:=0;

ans:=ans+dis(a[s[top]],a[s[1]]);

for i:=1 to top-1 do

ans:=ans+dis(a[s[i]],a[s[i+1]]);

writeln(round(ans));

end.

BZOJ3348 Cows 凸包 凸包面積

題目鏈結 題意 求凸包,求面積,然後給面積除以50,向下取整。用的andrew演算法,即跑兩次,先求出下凸包,然後再求出上凸包。求面積時候應該用凸包陣列求,結果寫成了原來的點的陣列,調了20多分鐘。弱智 2 telekinetic forest guard include include inclu...

poj1113 求凸包 計算凸包周長

經典的求凸包題,模板題。要求用資源最少,那肯定這個多邊形是個凸多邊形,也就是凸包。所以先求出凸包,計算它的周長。還有就是這道題所說的,要離城牆l遠,其實就是在加上乙個圓的周長,圓的半徑就是l。都說到這了,這道題還差什麼?還差乙個經典的凸包模板!哈哈 如下 include include includ...

bzoj2829 信用卡凸包 凸包

26.0 2.0 0.0 0.0 0.0 0.0 2.0 2.0 1.5707963268 21.66 本樣例中的2張信用卡的輪廓在上圖中用實線標出,如果視1.5707963268為 pi 2 pi為圓周率 則其凸包的周長為16 4 sqrt 2 題解 把邊上的圓去掉然後求一遍凸包,最後再加上乙個圓...