HDU2150-Pipe-判断线段是否相交

题意:

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

思路:

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

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

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

猜你喜欢

转载自www.cnblogs.com/OFSHK/p/12694778.html