zoukankan      html  css  js  c++  java
  • [poj] 2074 Line of Sight || 直线相交求交点

    原题

    给出一个房子(线段)的端点坐标,和一条路的两端坐标,给出一些障碍物(线段)的两端坐标。问在路上能看到完整房子的最大连续长度是多长。


    将障碍物按左端点坐标排序,然后用房子的右端与障碍物的左端连线,房子的左端和前一障碍物的右端比较,得出在道路上的能看到的长度取Max即可

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    double a,b,c,l,lmx,ans;
    int n,pos;
    struct point
    {
        double x,y;
        bool operator < (const point &b) const
    	{
    	    if (x==b.x) return y<b.y;
    	    return x<b.x;
    	}
        bool operator == (const point &b) const
    	{
    	    return x==b.x && y==b.y;
    	}
    }p1,p2,p3,p4;
    struct hhh
    {
        point left,right;
        void init(double a,double b,double c)
    	{
    	    left.x=a;
    	    right.x=b;
    	    left.y=right.y=c;
    	}
        bool operator < (const hhh &b) const
    	{
    	    if (left==b.left) return right<b.right;
    	    return left<b.left;
    	}
    }house,surplus[110],line;
    
    double max(double x,double y) { return x>y?x:y; }
    double min(double x,double y) { return x<y?x:y; }
    
    double find(point a,point b,point c,point d)
    {
        double tmp=((a.x-c.x)*(c.y-d.y)-(a.y-c.y)*(c.x-d.x))/((a.x-b.x)*(c.y-d.y)-(a.y-b.y)*(c.x-d.x));
        return  (b.x-a.x)*tmp+a.x;
    }
    
    int main()
    {
        while (~scanf("%lf%lf%lf",&a,&b,&c))
        {
    	if (a==0 && b==0 && c==0) break;
    	house.init(a,b,c);
    	scanf("%lf%lf%lf",&a,&b,&c);
    	line.init(a,b,c);
    	scanf("%d",&n);
    	for (int i=1;i<=n;i++)
    	{
    	    scanf("%lf%lf%lf",&a,&b,&c);
    	    surplus[i].init(a,b,c);
    	}
    	sort(surplus+1,surplus+n+1);
    	lmx=ans=-1;
    	p3=line.left;
    	p4=line.right;
    	for (int i=1;i<=n+1;i++)
    	{
    	    double l,r;
    	    if (surplus[i].left.y>=house.left.y) continue;
    	    if (i==1) l=line.left.x;
    	    else
    	    {
    		p1=house.left;
    		p2=surplus[i-1].right;
    		l=find(p1,p2,p3,p4);
    	    }
    	    if (i==n+1) r=line.right.x;
    	    else
    	    {
    		p1=house.right;
    		p2=surplus[i].left;
    		r=find(p1,p2,p3,p4);
    	    }
    	    l=max(l,line.left.x);
    	    r=min(r,line.right.x);
    	    l=max(l,lmx);
    	    lmx=max(lmx,l);
    	    ans=max(ans,r-l);
    	}
    	if (ans<=0) printf("No View
    ");
    	else printf("%.2f
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    根据列的值改变DataGridView行的颜色
    在WebForm上进行拖拽
    使用jQuery, CSS, JSON 和ASP.NET打造一个新闻轮换控件
    C#语法中的select
    C#事件(event)解析
    一步一步教你打造一个Numeric TextBox控件
    2010创造奇迹的一年
    超级简单:在一个TextArea中如何限制行数和字符数
    如何成为人尽皆知的C#开发人员
    一个"简单"的ASP.NET的服务器控件
  • 原文地址:https://www.cnblogs.com/mrha/p/8168539.html
Copyright © 2011-2022 走看看