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

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

挑战程序设计竞赛(算法和数据结构)——7.2分割(上)JAVA实现