挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现
Posted 小乖乖的臭坏坏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现相关的知识,希望对你有一定的参考价值。
题目与思路:
代码:
import java.util.*;
public class ManhattanGeometry
public static class EpElement
private GraghBasic.Point P;
private String direction;//left, right, bottom, top
private int id;
EpElement()
EpElement(GraghBasic.Point P, String direction, int id)
this.P = P;
this.direction = direction;
this.id = id;
public static void main(String[] args)
//定义EP表Vector容器内的基本元素
Vector<EpElement> EP = new Vector<EpElement>();
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
for (int i=0;i<n;i++)
int x1 = cin.nextInt();
int y1 = cin.nextInt();
int x2 = cin.nextInt();
int y2 = cin.nextInt();
GraghBasic.Point p1 = new GraghBasic.Point(x1, y1);
GraghBasic.Point p2 = new GraghBasic.Point(x2, y2);
String d = getDirection(p1, p2);
//将每一个点加入到S中
if (d.equals("V"))
//如果是垂直方向
if(p1.y<p2.y)
EpElement ep1 = new EpElement(p1, "bottom", i);
EpElement ep2 = new EpElement(p2, "top", i);
EP.add(ep1);
EP.add(ep2);
else
EpElement ep1 = new EpElement(p1, "top", i);
EpElement ep2 = new EpElement(p2, "bottom", i);
EP.add(ep1);
EP.add(ep2);
else
//如果是水平方向
if(p1.x<p2.x)
EpElement ep1 = new EpElement(p1, "left", i);
EpElement ep2 = new EpElement(p2, "right", i);
EP.add(ep1);
EP.add(ep2);
else
EpElement ep1 = new EpElement(p1, "right", i);
EpElement ep2 = new EpElement(p2, "left", i);
EP.add(ep1);
EP.add(ep2);
//自定义容器比较器
Collections.sort(EP, new Comparator<Object>()
@Override
public int compare(Object o1, Object o2)
EpElement s1 = (EpElement) o1;
EpElement s2 = (EpElement) o2;
if (s1.P.y>s2.P.y)
return 1;//返回1,就默认前者大于后者
else if(s1.P.y<s2.P.y)
return -1;
else
if(s1.P.x>s2.P.x)
return 1;
else if(s1.P.x<s2.P.x)
return -1;
else
return 0;
);
//比较器输出检验
/* for (EpElement e : EP)
System.out.println("id:" + e.id + " x:" + e.P.x + " y:" + e.P.y + " direction:" + e.direction);
// id:2 x:4.0 y:1.0 direction:bottom
// id:0 x:2.0 y:2.0 direction:bottom
// id:3 x:5.0 y:2.0 direction:left
// id:3 x:7.0 y:2.0 direction:right
// id:1 x:1.0 y:3.0 direction:left
// id:1 x:5.0 y:3.0 direction:right
// id:2 x:4.0 y:4.0 direction:top
// id:0 x:2.0 y:5.0 direction:top
*/
int cnt = manhattanGeometry(EP);
System.out.println(cnt);
public static String getDirection(GraghBasic.Point p1, GraghBasic.Point p2)
if(p1.x==p2.x)
//垂直方向
return "V";
else
//水平方向
return "H";
public static int manhattanGeometry(Vector<EpElement> S)
int cnt = 0;
ArrayList<Integer> T = new ArrayList<Integer>();
int n = S.size();
for (int i=0;i<n;i++)
if(S.elementAt(i).direction.equals("bottom"))
T.add((int) S.elementAt(i).P.x);
else if(S.elementAt(i).direction.equals("top"))
for (int j=0;j<T.size();j++)
if(T.get(j)==S.elementAt(i).P.x)
T.remove(j);
else if(S.elementAt(i).direction.equals("left"))
int right_x=0;
int left_x = (int)S.elementAt(i).P.x;
//获取右节点的x值
for (int j=0;j<n;j++)
if(S.elementAt(j).id==S.elementAt(i).id && S.elementAt(j).direction.equals("right"))
right_x = (int)S.elementAt(j).P.x;
break;
for (int j=0;j<T.size();j++)
if(T.get(j)<=right_x && T.get(j)>=left_x)
cnt++;
return cnt;
输入:
6
2 2 2 5
1 3 5 3
4 1 4 4
5 2 7 2
6 1 6 3
6 5 6 7
输出:
3
以上是关于挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现的主要内容,如果未能解决你的问题,请参考以下文章
挑战程序设计竞赛(算法和数据结构)——分割(下)&快速排序的JAVA实现
挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现
挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现
挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现