zoukankan      html  css  js  c++  java
  • HDU1086+几何+判断线段相交

    详见代码

    View Code
     1 /*
     2 几何+线段相交
     3 */
     4 #include<stdio.h>
     5 #include<string.h>
     6 #include<stdlib.h>
     7 #include<algorithm>
     8 #include<iostream>
     9 #include<queue>
    10 //#include<map>
    11 #include<math.h>
    12 using namespace std;
    13 typedef long long ll;
    14 //typedef __int64 int64;
    15 const int maxn = 105;
    16 const int inf = 0x7fffffff;
    17 const double pi=acos(-1.0);
    18 const double eps = 1e-8;
    19 struct point {
    20     double x,y;
    21 };
    22 struct line{
    23     point a,b;
    24 };
    25 line myline[ maxn ];
    26 
    27 double xmult( point a,point b,point c ){
    28     return ( a.x-c.x )*( b.y-c.y )-( a.y-c.y )*( b.x-c.x );
    29 }
    30 bool inLine( line now,point p ){
    31     double minx,maxx,miny,maxy;
    32     minx=min( now.a.x,now.b.x );
    33     maxx=max( now.a.x,now.b.x );
    34     miny=min( now.a.y,now.b.y );
    35     maxy=max( now.a.y,now.b.y );
    36     if( p.x>=minx&&p.x<=maxx&&p.y>=miny&&p.y<=maxy )
    37         return true;
    38     else
    39         return false;
    40 }
    41 bool intersect( line one,line two ){
    42     double d1,d2,d3,d4;
    43     d1=xmult( two.a,one.b,one.a );
    44     d2=xmult( two.b,one.b,one.a );
    45     d3=xmult( one.a,two.a,two.b );
    46     d4=xmult( one.b,two.a,two.b );
    47     if( d1*d2<0&&d3*d4<0 )
    48         return true;//相互跨过
    49     if( d1==0&&inLine( one,two.a )==true )
    50         return true;
    51     if( d2==0&&inLine( one,two.b )==true )
    52         return true;
    53     if( d3==0&&inLine( two,one.a )==true )
    54         return true;
    55     if( d4==0&&inLine( two,one.b )==true )
    56         return true;//分别表示某个点在一条直线上的情况
    57     return false;
    58 }
    59 
    60 int main(){
    61     int n;
    62     while( scanf("%d",&n)!=EOF,n ){
    63         for( int i=0;i<n;i++ ){
    64             scanf("%lf%lf%lf%lf",&myline[ i ].a.x,&myline[ i ].a.y,&myline[ i ].b.x,&myline[ i ].b.y);
    65         }
    66         int sum=0;//交点的个数
    67         for( int i=0;i<n;i++ ){
    68             for( int j=i+1;j<n;j++ ){
    69                 if( intersect( myline[ i ],myline[ j ] )==true )
    70                     sum++;
    71             }
    72         }
    73         printf("%d\n",sum);
    74     }
    75     return 0;
    76 }
    keep moving...
  • 相关阅读:
    HDU 2594 扩展kmp模板题
    HDU 1358 简单kmp
    HDU 3336 扩展kmp
    SPOJ SUBLEX 求第k小子串
    Codeforces 235C
    HDU 4622 Reincarnation
    HDU 4622 求解区间字符串中的不同子串的个数
    [LeetCode] Length of Last Word 字符串查找
    [LeetCode] Sudoku Solver 解数独,递归,回溯
    [LeetCode] Longest Common Prefix 字符串公有前序
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2969727.html
Copyright © 2011-2022 走看看