• hdu1086(线段相交)


    题目意思:

    给出n个线段,推断这n条线段中,线段相交的对数。

    http://acm.hdu.edu.cn/showproblem.php?pid=1086

    题目分析:

    此题主要写出推断线段相交的函数,然后推断每一对线段就可以,时间复杂度O(n*n)。详解见代码。


    AC代码:

    /**
     *推断AB和CD两线段是否有交点:
     *同一时候满足两个条件:('x'表示叉积)
     * 1.C点D点分别在AB的两側.(向量(ABxAC)*(ABxAD)<=0)
     * 2.A点和B点分别在CD两側.(向量(CDxCA)*(CDxCB)<=0)
     *   3.  向量(ABxAC)*(ABxAD)<0代表在直线两側, =0代表在直线上。
     */
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef struct Node{
        double x,y;
    }node;
    node p[105],p1[101];
    double Direction(node pi,node pj,node pk){//计算叉乘
        return (pk.x-pi.x)*(pj.y-pi.y)-(pj.x-pi.x)*(pk.y-pi.y);
    }

    bool Segments_X(node p1,node p2,node p3,node p4){//推断两条线段是否相交
        double d1,d2,d3,d4;
        d1=Direction(p3,p4,p1);
        d2=Direction(p3,p4,p2);
        d3=Direction(p1,p2,p3);
        d4=Direction(p1,p2,p4);
        if(d1*d2<=0&&d3*d4<=0) return true;
        return false;
    }
    int main()
    {
        int n;
        while(cin>>n&&n){
            for(int i=1;i<=n;i++){
                cin>>p[i].x>>p[i].y>>p1[i].x>>p1[i].y;
            }
            int k=0;
            for(int i=1;i<=n-1;i++){
                for(int j=i+1;j<=n;j++){
                    if(Segments_X(p[i],p1[i],p[j],p1[j])) k++;
                }
            }
            cout<<k<<endl;
        }
        return 0;
    }


  • 相关阅读:
    高程图 GridMap
    VINS-Mono代码分析与总结(二) 系统初始化
    IMU误差模型与校准
    VINS-Mono代码分析与总结(一) IMU预积分
    XJTU 大一上
    iOS路由最佳选择是什么
    正向代理、反向代理、透明代理
    centos7国内镜像glbc版安装
    IntelliJ idea 中使用Git
    Mongo DB 2.6 需要知道的一些自身限定
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4213303.html
Copyright © 2020-2023  润新知