感覺這就不是計算幾何題,是排序題……
做兩次二級排序,關鍵字是點的x,y座標值。x優先排序時,計算共線的點 y 的差距絕對值之和,就是所有豎直(南北向)圍牆長度;y優先排序時,計算共線點 x 的差距絕對值之和,就是所有橫著(東西向)的圍牆長度。兩個加起來輸出就好。
ps:注意凹多形的情況,下面給幾組資料就是凹的情況
12
2 0
3 0
0 1
2 1
0 2
1 2
0 3
1 3
2 3
3 3
0 4
2 4
The length of the fence will be 16 units.
81 21 32 12 23 13 24 24 3The length of the fence will be 10 units.
代碼:
#include<stdio.h><br />#include<math.h><br />#include<stdlib.h><br />#define N 14<br />struct point<br />{<br />int x,y;<br />}p[N];<br />int cmp1(const void *a,const void *b)<br />{<br />struct point *aa=(point *)a;<br />struct point *bb=(point *)b;<br />if(aa->x==bb->x)return aa->y > bb->y ?1:-1;<br />else return aa->x > bb->x ?1:-1;<br />}<br />int cmp2(const void *a,const void *b)<br />{<br />struct point *aa=(struct point *)a;<br />struct point *bb=(struct point *)b;<br />if(aa->y==bb->y)return aa->x > bb->x ?1:-1;<br />else return aa->y > bb->y ?1:-1;<br />}<br />int main()<br />{<br />int i,s,n;<br />while(scanf("%d",&n),n)<br />{<br />for(i=0;i<n;i++)<br />scanf("%d%d",&p[i].x,&p[i].y);<br />s=0;<br />qsort(p,n,sizeof(p[0]),cmp1);<br />for(i=0;i<n-1;)<br />{<br />if(p[i].x==p[i+1].x)<br />{<br />s+=abs(p[i].y-p[i+1].y);<br />i=i+2;<br />}<br />else i++;<br />}<br />qsort(p,n,sizeof(p[0]),cmp2);<br />for(i=0;i<n-1;)<br />{<br />if(p[i].y==p[i+1].y)<br />{<br />s+=abs(p[i].x-p[i+1].x);<br />i=i+2;<br />}<br />else i++;<br />}<br />printf("The length of the fence will be %d units./n",s);</p><p>}<br />return 0;<br />}