哎~操蛋的计算几何。。= =poj3304Segments

来源:互联网 发布:知乎怎样添加话题 编辑:程序博客网 时间:2024/05/21 10:33

其实吧~做这道题目的经历很简单,就是这道题目看上去比较简单,然后,不知道做,然后,就上网搜阶梯报告,然后操蛋的发现解题报告也不对,然后脸都绿了,还是

zhangji学长善良~~啦啦啦

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define eps 1e-8int i,n;struct Point{    double x,y;};struct Line{    Point a,b;}line[110];double length(Point a,Point b){    return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) );}double multi(Point p0,Point p1,Point p2){    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}int  judge(Point a,Point b){    if(length(a,b)<eps)    {        return 0;    }    else    {        for(i=0;i<n;i++)        {            if(multi(a,b,line[i].a)*multi(a,b,line[i].b)>eps) return 0;        }    }    return 1;}int main(){    int t,j;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(i=0;i<n;i++)        {           scanf("%lf%lf%lf%lf",&line[i].a.x,&line[i].a.y,&line[i].b.x,&line[i].b.y);        }        int ans=0; for(int i=0;i<n&&!ans;i++){ if(judge(line[i].a,line[i].b))ans=1; for(int j=i+1;j<n&&!ans;j++){ if(judge(line[i].a,line[j].a))ans=1; if(judge(line[i].a,line[j].b))ans=1; if(judge(line[i].b,line[j].a))ans=1; if(judge(line[i].b,line[j].b))ans=1; } }                if(ans)            printf("Yes!\n");        else            printf("No!\n");    }    return 0;}
这道题目的转化好难。。= =简单的来说就是这样子的,n条直线的投影的相交处引出来的垂直的直线必然与所有的线段都相交。然后,将这条线段进行平行处理,必然会与端点相交。感觉这根本不是我能做的题目。。还是挺模糊的。不过有个知识点就是直线与线段相交的判定,其实直线与线段相交和线段与线段相交一样都是很普通的东西。。= =直线跟线段泥萌表打我

0 0
原创粉丝点击