X-man

导航

poj 3304 Segments (题意理解出错,错误的只枚举了过线段的直线)

//枚举过每一条线段的直线,
//再判断其他线段的点在直线上或被直线穿过
//即求直线与线段相交(叉积)
#include<stdio.h>
#include<math.h>
#define esp 1e-8
struct Node
{
    double x,y;
} a[105],b[105],c[210],tmp1,tmp2;
double cal(Node a,Node b,Node c)//ca*cb
{
    return ((a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y));
}
double diji(Node a,Node b,Node c)//ab·ac
{
    return (b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y);
}
int main()
{
    int _case,i,j,k,n;
    scanf("%d",&_case);
    while(_case--)
    {
        scanf("%d",&n);
        for(i=0; i<n; i++)
        {
            scanf("%lf%lf",&a[i].x,&a[i].y);
            c[2*i]=a[i];
            scanf("%lf%lf",&b[i].x,&b[i].y);
            c[2*i+1]=b[i];
        }
        for(i=0; i<2*n; i++)
        {
            tmp1=c[i];
            for(k=i+1; k<2*n; k++)
            {
                tmp2=c[k];
                if(fabs(tmp1.x-tmp2.x)<esp&&fabs(tmp1.y-tmp2.y)<esp)continue;//判断重点
                //printf("%d#\n",i);
                for(j=0; j<n; j++)
                {
                    double k=cal(a[j],tmp2,tmp1)*cal(b[j],tmp2,tmp1);

                    if(k>esp)break;
                }
                if(j==n)break;
            }
            if(j==n)break;
        }
        if(j!=n)printf("No!\n");
            else printf("Yes!\n");
    }
    return 0;
}

 

posted on 2013-07-23 10:21  雨钝风轻  阅读(294)  评论(0编辑  收藏  举报