• hdu1086(规范相交模版题)


    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    typedef struct node
    {
        double x;
        double y;
    }point;
    typedef struct ed
    {
        point a;
        point b;
        int is_top;
    }edge;
    edge e[100005];
    
    point make_e(point x,point y)
    {
        point a;
        a.x = x.x - y.x;
        a.y = x.y - y.y;
        return a;
    }
    
    double cha(point x,point y)
    {
        return x.x*y.y - y.x*x.y;
    }
    
    double cross(edge a,point c)
    {
        point e1,e2;
        e1 = make_e(a.a,c);
        e2 = make_e(a.a,a.b);
        return cha(e2,e1);
    }
    
    int main()
    {
        int n,i,j;
        while(scanf("%d",&n)&&n)
        {
            for(i = 0;i < n;i++)
            scanf("%lf %lf %lf %lf",&e[i].a.x,&e[i].a.y,&e[i].b.x,&e[i].b.y),e[i].is_top = 0;
            int count = 0;
            for(i = 0;i < n;i++)
            {
                for(j = i+1;j < n;j++)
                {
                    if(i != j)
                    {
                        if(cross(e[i],e[j].a)*cross(e[i],e[j].b) <= 0 && cross(e[j],e[i].a)*cross(e[j],e[i].b) <= 0)
                        count++;
                    }
                }
            }
                   printf("%d\n",count);
    
        }
        return 0;
    }

    pc代码

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    using namespace std;
    const int N=102;
    double eps=0.0000000001;
    
    struct node
    {
        double x,y;
    }sh[N],se[N];
    int n;
    
    double jud(node a,node b,node c)
    {
        return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
    }
    bool cross(int i,int j)
    {
        double k1=jud(sh[i],se[i],sh[j]);
        double k2=jud(sh[i],se[i],se[j]);
        double k3=jud(sh[j],se[j],sh[i]);
        double k4=jud(sh[j],se[j],se[i]);
        if(k1*k2<eps&&k3*k4<eps)return true;
        return false;
    }
    
    int main()
    {
        int i,j,k;
        while(cin>>n,n)
        {
            for(i=0;i<n;i++)
            {
                scanf("%lf %lf %lf %lf",&sh[i].x,&sh[i].y,&se[i].x,&se[i].y);
            }
            int ans=0;
            for(i=0;i<n-1;i++)
            {
                for(j=i+1;j<n;j++)
                {
                    if(cross(i,j))ans++;
                }
            }
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    组合继承
    包装明星——封装
    多种添加公用方法的方式
    专有扩展
    插入标记
    mac 命令操作
    php(apache)切换版本
    SqlServer索引+约束篇章
    sqlserver 常用语法
    C# 通用数据访问类
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2640220.html
Copyright © 2020-2023  润新知