zoukankan      html  css  js  c++  java
  • HDU 1086 线段相交(不规范相交模板)

    题意:

    很多线段,求总交点个数(不规范相交),没有三线共点

    题解:

    模板,拿几道计算几何水题开头,准备计算几何专题了~

    这个题的细节其实很多,只是数据太水了!

    不规范相交模板:

    View Code
     1 #include <iostream>
     2 #include <cstdlib>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <algorithm>
     6 #include <cmath>
     7 
     8 #define N 110
     9 #define EPS 1e-7 
    10 #define dc doublecmp
    11 //不规范相交
    12 using namespace std;
    13 
    14 struct PO
    15 {
    16     double x,y;
    17 };
    18 
    19 struct LI
    20 {
    21     PO a,b;
    22 }li[N];
    23 
    24 int n;
    25 
    26 inline int doublecmp(double x)
    27 {
    28     if(x>EPS) return 1;
    29     else if(x<-EPS) return -1;
    30     return 0;
    31 }
    32 
    33 inline double cross(PO &a,PO &b,PO &c)
    34 {
    35     return (c.x-a.x)*(b.y-a.y)-(c.y-a.y)*(b.x-a.x);
    36 }
    37 
    38 inline double dot(PO &a,PO &b,PO &c)
    39 {
    40     return (b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y);
    41 }
    42 
    43 inline bool onseg(PO &a,PO &b,PO &c)//c在ab线段上 
    44 {
    45     double maxx=max(a.x,b.x);
    46     double maxy=max(a.y,b.y);
    47     double minx=min(a.x,b.x);
    48     double miny=min(a.y,b.y);
    49     if(dc(cross(a,b,c))==0&&dc(c.x-minx)>=0&&dc(c.x-maxx)<=0&&dc(c.y-miny)>=0&&dc(c.y-maxy)<=0)
    50         return true;
    51     return false;
    52 }
    53 
    54 inline bool segcross(LI &a,LI &b)//判断线段相交(不规范) 
    55 {
    56     int d1,d2,d3,d4;
    57     d1=dc(cross(b.a,b.b,a.a));
    58     d2=dc(cross(b.a,b.b,a.b));
    59     d3=dc(cross(a.a,a.b,b.a));
    60     d4=dc(cross(a.a,a.b,b.b));
    61     if(d1*d2<0&&d3*d4<0) return true;
    62     if(d1==0&&onseg(b.a,b.b,a.a)) return true;
    63     if(d2==0&&onseg(b.a,b.b,a.b)) return true;
    64     if(d3==0&&onseg(a.a,a.b,b.a)) return true;
    65     if(d4==0&&onseg(a.a,a.b,b.b)) return true;
    66     return false;
    67 }
    68 
    69 inline void read()
    70 {
    71     for(int i=1;i<=n;i++)
    72         scanf("%lf%lf%lf%lf",&li[i].a.x,&li[i].a.y,&li[i].b.x,&li[i].b.y);
    73 }
    74 
    75 inline void go()
    76 {
    77     int ans=0;
    78     for(int i=1;i<=n;i++)
    79         for(int j=i+1;j<=n;j++)
    80             if(segcross(li[i],li[j])) ans++;
    81     printf("%d\n",ans);
    82 }
    83 
    84 int main()
    85 {
    86     while(scanf("%d",&n),n) read(),go();
    87     return 0;
    88 }
  • 相关阅读:
    待思考问题---数据库的分层模型
    iOS的常用类库
    java spring是元编程框架---使用的机制是注解+配置
    Java Virtual Machine (JVM), Difference JDK, JRE & JVM – Core Java
    Spring注解的使用和组件扫描
    Spring Boot实战:拦截器与过滤器
    问题、存在与认知---问题产生的原因是对存在的不完全或错误认知
    元编程的分层模型
    元编程的本质---高级语言的表达通过解释生成低级语言的表达(代码)
    aop分层模型——aop是元编程的一种
  • 原文地址:https://www.cnblogs.com/proverbs/p/2923776.html
Copyright © 2011-2022 走看看