学习凸包(三):凸包练习 POJ 1113

来源:互联网 发布:飞歌导航端口波特率 编辑:程序博客网 时间:2024/04/29 04:55
接上文:学习凸包(二):分治法求解http://128kj.iteye.com/blog/1748622

通过前面两文学习,基本上明白了凸包,先做个练习POJ 1113.

POJ 1113题意:
从前有一个吝啬的国王要求他的总设计师在他的城堡周围建一道围墙。这国王非常吝啬,以至于他没有听总设计师的建一个拥有外形漂亮又高大的砖头塔楼的围墙的建议,而是要求用最少的石头和劳工围着整个城堡建围墙,但是要求围墙必须远离城堡一定的距离。要是国王发现发现设计师用了超过建造围墙所需要的材料,那么这个设计师的脑袋将保不住了。而且,国王要求设计师马上拿出一个建墙的计划,列出建造围墙所需要的最少的材料。你的任务是去帮助这个可怜的设计师保住他的性命,请写一个程序算出建造满足国王要求的围墙的最小的长度。这个任务事实上稍微有点简单,因为国王的城堡是一个多边形的,除开顶点处,其他的地方不会相交,并且位于平坦的地面上,设计师早已画好了一个笛卡尔坐标系,而且精确地计算出了城堡中每一个点的坐标。



Input
第一行包括两个整数,N,L,第一个整数是点的个数,第二个整数是围墙必须远离城堡的距离。接下来n行,每行两个数{中间一个空格}表示每一个点的坐标。所有的点各不相同。

Output
输出一个整数,即围墙的长度。答案四舍五入

样例:
Sample Input

9 100
200 400
300 400
300 300
400 300
400 400
500 400
500 200
350 200
200 200
Sample Output

1628


从图可以看出,所求围墙(虚线部分)长度 = 凸包边长 + 一个圆周长

下面是AC代码(分治法求凸包):
Java代码 复制代码 收藏代码
  1. import java.util.*;
  2. class Line {//线
  3. Point p1, p2;
  4. Line(Point p1, Point p2) {
  5. this.p1 = p1;
  6. this.p2 = p2;
  7. }
  8. public double getLength() {
  9. double dx = Math.abs(p1.x - p2.x);
  10. double dy = Math.abs(p1.y - p2.y);
  11. return Math.sqrt(dx * dx + dy * dy);
  12. }
  13. }
  14. class Point{//点
  15. double x;
  16. double y;
  17. public Point(double x,double y){
  18. this.x=x;
  19. this.y=y;
  20. }
  21. }
  22. /*
  23. * 分治法求凸包
  24. */
  25. class QuickTuBao {
  26. List<Point> pts = null;//点集
  27. List<Line> lines = new ArrayList<Line>();//点集pts的凸包
  28. public void setPointList(List<Point> pts) {
  29. this.pts = pts;
  30. }