ZOJ 2157 Building a New Depot(POJ 1788)

感觉这就不是计算几何题,是排序题……

 

做两次二级排序,关键字是点的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.

 

 

8
1 2
1 3
2 1
2 2
3 1
3 2
4 2
4 3

The length of the fence will be 10 units.

 

代码:

#include<stdio.h> #include<math.h> #include<stdlib.h> #define N 14 struct point { int x,y; }p[N]; int cmp1(const void *a,const void *b) { struct point *aa=(point *)a; struct point *bb=(point *)b; if(aa->x==bb->x)return aa->y > bb->y ?1:-1; else return aa->x > bb->x ?1:-1; } int cmp2(const void *a,const void *b) { struct point *aa=(struct point *)a; struct point *bb=(struct point *)b; if(aa->y==bb->y)return aa->x > bb->x ?1:-1; else return aa->y > bb->y ?1:-1; } int main() { int i,s,n; while(scanf("%d",&n),n) { for(i=0;i<n;i++) scanf("%d%d",&p[i].x,&p[i].y); s=0; qsort(p,n,sizeof(p[0]),cmp1); for(i=0;i<n-1;) { if(p[i].x==p[i+1].x) { s+=abs(p[i].y-p[i+1].y); i=i+2; } else i++; } qsort(p,n,sizeof(p[0]),cmp2); for(i=0;i<n-1;) { if(p[i].y==p[i+1].y) { s+=abs(p[i].x-p[i+1].x); i=i+2; } else i++; } printf("The length of the fence will be %d units./n",s); } return 0; } 

你可能感兴趣的:(ZOJ 2157 Building a New Depot(POJ 1788))