zoukankan      html  css  js  c++  java
  • HDU2150Pipe判断线段是否相交

    题意:

    给出一条管道的几个点(是折线),判断管道之间是否有相交,

    思路:

    把每条管道的折线形式分为一个个线段,每条管道的线段和其他管道的线段进行枚举判断

    说白了就是:判断线段是否相交,也是模板题

    AC代码:

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<stdio.h>
     4 #include<queue>
     5 #include<string.h>
     6 using namespace std;
     7 
     8 struct node
     9 {
    10     int x,y;
    11 }a[35][110];
    12 int k[35];
    13 
    14 int cc(node a,node b,node c)//计算叉乘:BA叉乘CA
    15 {
    16     return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
    17 }
    18 
    19 bool judge(node a,node b,node c,node d)//判断两线段是否相交
    20 {
    21     //快速排斥法
    22     int x=min(a.y,b.y)<=max(c.y,d.y);
    23     int y=min(c.y,d.y)<=max(a.y,b.y);
    24     int z=min(c.x,d.x)<=max(a.x,b.x);
    25     int w=min(a.x,b.x)<=max(c.x,d.x);
    26     //跨立实验法
    27     int p=cc(a,b,c)*cc(a,d,b);
    28     int q=cc(a,c,d)*cc(b,d,c);
    29     if(x&&y&&z&&w&&p>=0&&q>=0)
    30         return 1;
    31     return 0;
    32 }
    33 
    34 int main()
    35 {
    36     int n;
    37     while(~scanf("%d",&n))
    38     {
    39         for(int i=0;i<n;i++)
    40         {
    41             scanf("%d",&k[i]);
    42             for(int j=0;j<k[i];j++)
    43                 scanf("%d %d",&a[i][j].x,&a[i][j].y);
    44 
    45         }
    46         if(n==1)
    47         {
    48             printf("No\n");
    49             continue;
    50         }
    51         bool flag=0;
    52         for(int i=0;i<n-1;i++)
    53         {
    54             for(int j=1;j<k[i];j++)
    55             {
    56                 for(int pp=i+1;pp<n;pp++)
    57                 {
    58                     for(int qq=1;qq<k[pp];qq++)
    59                     {
    60                         if(judge(a[i][j-1],a[i][j],a[pp][qq-1],a[pp][qq]))
    61                         {
    62                             flag=1;
    63                             break;
    64                         }
    65                     }
    66                 }
    67             }
    68         }
    69         if(flag)
    70             printf("Yes\n");
    71         else
    72             printf("No\n");
    73     }
    74     return 0;
    75 }
    View Code
  • 相关阅读:
    浅析电商防止恶意下单
    Dubbo与Hadoop RPC的区别
    中秋福利 | 10本技术图书(编程语言、数据分析等)免费送
    IOS渠道追踪方式
    数据迁移的应用场景与解决方案Hamal
    JVM锁实现探究2:synchronized深探
    网页设计简史看设计&代码“隔膜”
    知物由学 | 你真的了解网络安全吗?
    一行代码搞定Dubbo接口调用
    测试周期内测试进度报告规范
  • 原文地址:https://www.cnblogs.com/OFSHK/p/12694778.html
Copyright © 2011-2022 走看看