给你这些标杆的点,点与点之间的连线只有南北,和东西方向。只有在拐点上的点。
计算这些点围城的多边形的周长。
将这些点二次排序。
第一次纵向排序,算出 x 的差值累加就为,所有东西方向线段的长度。
第二次横向排序,算出 y 的差值累加就为,所有南北方向线段的长度。
#include <cmath>
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct point{ int x,y;};
point p[100010];
bool linecmp(point a,point b)
{
return a.y == b.y?a.x<b.x:a.y<b.y;
}
bool rowcmp(point a,point b)
{
return a.x==b.x?a.y<b.y:a.x<b.x;
}
int main()
{
int n;
freopen("in.txt","r",stdin);
while( ~scanf("%d",&n) && n )
{
for(int i=0; i<n; i++)
scanf("%d %d",&p[i].x,&p[i].y);
sort(p,p+n,linecmp);
// for( int i = 0 ;i <n;++i)
// {
// cout<<"("<<p[i].x<<","<<p[i].y<<")"<<endl;
// }
int sum = 0;
for(int i=0; i<n; i+=2)
{
sum += (p[i+1].x - p[i].x);
//printf("i=%d p.x=%d p.y=%d i+1=%d p.x=%d p.y=%d\n",i,p[i].x,p[i].y,i+1,p[i+1].x,p[i+1].y);
}
sort(p,p+n,rowcmp);
for(int i=0; i<n; i+=2)
sum += (p[i+1].y - p[i].y);
printf("The length of the fence will be %d units.\n",sum);
}
return 0;
}