挑战程序设计竞赛(算法和数据结构)——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实现