HDU2150-Pipe-折线相交(叉乘)

来源:互联网 发布:mac删除windows后内存 编辑:程序博客网 时间:2024/05/21 08:03

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2150

好吧,之前一直不想用叉乘判断线段相交问题,毕竟我觉得用直线方程是在是太方便太直接了;

直到我遇到了这个题目,真的是给它跪了,WA到死。。。不得跪舔叉乘。。。

至于叉乘,我就不赘述了,这个博客写的很不错,可以看看;链接:http://blog.csdn.net/chenbang110/article/details/7742535

#include<iostream>#include<string>#include<cstdio>#include<cstring>#include<queue>#include<map>#include<cmath>#include<stack>#include<set>#include<vector>#include<algorithm>#define LL long long#define inf 1<<30#define s(a) scanf("%d",&a)#define Clear(a,b) memset(a,b,sizeof(a))using namespace std;const int N=200005;int n,a,b;int num[105];struct node{    double x,y;};node P[35][105];double Cross_Prouct(node A,node B,node C)       //  计算BA叉乘CA;{    return (B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x);}bool Intersect(node A,node B,node C,node D)     //  通过叉乘判断线段是否相交;{    if(min(A.x,B.x)<=max(C.x,D.x)&&         //  快速排斥实验;       min(C.x,D.x)<=max(A.x,B.x)&&       min(A.y,B.y)<=max(C.y,D.y)&&       min(C.y,D.y)<=max(A.y,B.y)&&       Cross_Prouct(A,B,C)*Cross_Prouct(A,B,D)<0&&      //  跨立实验;       Cross_Prouct(C,D,A)*Cross_Prouct(C,D,B)<0)       //  叉乘异号表示在两侧;       return true;    else return false;}bool Solve()    //  暴力枚举每条折线的每条线段是否相交;{    for(int i=0;i<n-1;i++){        for(int j=i+1;j<n;j++){            for(int ii=1;ii<num[i];ii++){                for(int jj=1;jj<num[j];jj++){                    if(Intersect(P[i][ii-1],P[i][ii],P[j][jj-1],P[j][jj])) return true;                }            }        }    }    return false;}int main(){    while(~scanf("%d",&n)){        for(int i=0;i<n;i++){            s(num[i]);            for(int j=0;j<num[i];j++){                scanf("%lf%lf",&P[i][j].x,&P[i][j].y);            }        }        if(n==1) printf("No\n");        else{            bool flag=Solve();            if(!flag)printf("No\n");            else printf("Yes\n");        }    }    return 0;}


 

1 0
原创粉丝点击