题意:
给出一条管道的几个点(是折线),判断管道之间是否有相交,
思路:
把每条管道的折线形式分为一个个线段,每条管道的线段和其他管道的线段进行枚举判断
说白了就是:判断线段是否相交,也是模板题
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 }