挑战程序设计竞赛(算法和数据结构)——16.12凸包(安德鲁算法)的JAVA实现

Posted 小乖乖的臭坏坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——16.12凸包(安德鲁算法)的JAVA实现相关的知识,希望对你有一定的参考价值。

题目与思路:



代码:

import java.util.*;
//数据结果套数据结构时,需要一层一层初始化
public class ConvexHull 
    public static void main(String[] args) 
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        Vector<GraghBasic.Point> S = new Vector<GraghBasic.Point>();
        for (int i=0;i<n;i++)
            int x = cin.nextInt();
            int y = cin.nextInt();
            GraghBasic.Point p = new GraghBasic.Point(x, y);
            S.add(p);
        
        GraghBasic.Polygon P = new GraghBasic.Polygon(S);
//        P = mySort(P);

        GraghBasic.Polygon P_new = andrewScan(P);
        System.out.println(P_new.P.size());
        for (GraghBasic.Point p : P_new.P)
            System.out.println(p.x + " " + p.y);
        
    

    public static GraghBasic.Polygon andrewScan(GraghBasic.Polygon s)
        Vector<GraghBasic.Point> v1 = new Vector<GraghBasic.Point>();
        Vector<GraghBasic.Point> v2 = new Vector<GraghBasic.Point>();
        Vector<GraghBasic.Point> v3 = new Vector<GraghBasic.Point>();
        GraghBasic.Polygon u = new GraghBasic.Polygon(v1);
        GraghBasic.Polygon l = new GraghBasic.Polygon(v2);

        if(s.P.size()<3)return s;//不足三位的就不是多边形
        s = mySort(s);//对s中的元素进行排序
        u.P.add(s.P.elementAt(0));
        u.P.add(s.P.elementAt(1));
        l.P.add(s.P.elementAt(s.P.size()-1));
        l.P.add(s.P.elementAt(s.P.size()-2));

        //构建凸包上部
        for (int i=2;i<s.P.size();i++)
            for (int n=u.P.size();n>=2 && CounterClockwise.myCounterClockwise(u.P.elementAt(n-2), u.P.elementAt(n-1), s.P.elementAt(i))=="COUNTER_CLOCKWISE";n--)
                u.P.remove(u.P.size()-1);
            
            u.P.add(s.P.elementAt(i));
        

        //构建凸包下部
        for (int i=s.P.size()-3;i>=0;i--)
            for (int n=l.P.size();n>=2 && CounterClockwise.myCounterClockwise(l.P.elementAt(n-2), l.P.elementAt(n-1), s.P.elementAt(i))=="COUNTER_CLOCKWISE";n--)
                l.P.remove(l.P.size()-1);
            
            l.P.add(s.P.elementAt(i));
        

        GraghBasic.Polygon t = new GraghBasic.Polygon(v3);
        for (int k=l.P.size()-1;k>=1;k--)
            t.P.add(l.P.elementAt(k));
        
        for (int k=u.P.size()-1;k>=1;k--)
            t.P.add(u.P.elementAt(k));
        
        return t;
    

    public static GraghBasic.Polygon mySort(GraghBasic.Polygon s)
        int n = s.P.size();
        for (int i=0;i<n-1;i++)
            for (int j=i+1;j<n;j++)
                if(s.P.elementAt(i).x>s.P.elementAt(j).x)
                    Collections.swap(s.P, i, j);
                
                else if(s.P.elementAt(i).x==s.P.elementAt(j).x && s.P.elementAt(i).y>s.P.elementAt(j).y)
                    Collections.swap(s.P, i, j);
                
            
        
        return s;
    


输入:

7
2 1
0 0
1 2
2 2
4 2
1 3
3 3

输出:

5
0.0 0.0
2.0 1.0
4.0 2.0
3.0 3.0
1.0 3.0

以上是关于挑战程序设计竞赛(算法和数据结构)——16.12凸包(安德鲁算法)的JAVA实现的主要内容,如果未能解决你的问题,请参考以下文章

挑战程序设计竞赛(算法和数据结构)——分割(下)&快速排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现

挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现

挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现