poj 2074Line of Sight

注意点:

1.根本没有障碍线段情况

2.障碍线段不一定一定在房和平地之间

3.求出房的右端点与障碍左端点连线在平地同一直线的交点x1和房的左端点与障碍右端点连线在平地同一直线的交点x2,将投影(x1,x2)从左向右排序

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
//#define dps (1e-8)
#define MAXN 1010
struct node{
    double x1,x2,y;
}xy[MAXN];
double x11,x12,y1,x21,x22,y2,a1,a2,b1;
int n;
int cmp(const void *a,const void *b){//小的放前面
    node c=*(node*)a,d=*(node*)b;
    if(c.x1==d.x1)  return c.x2>d.x2?1:-1;
    return c.x1>d.x1?1:-1;
}
void cal(double &x3,double x1,double x2,double y2,double y3){
    double k=(y1-y2)/(y2-y3);//xy[i].y-
    x3=((1+k)*x2-x1)/k;
}
int main(){
    //freopen("D:\\INPUT.txt","r", stdin);
    while(scanf("%lf%lf%lf",&x11,&x12,&y1),x11!=0.0||x12!=0.0||y1!=0.0){
        scanf("%lf%lf%lf%d",&x21,&x22,&y2,&n);
        if(!n)
            cout<<x22-x12<<endl;
        int i=0;//,k=0;
        bool flag=false;
        for(;i<n;i++){
            scanf("%lf%lf%lf",&a1,&a2,&b1);
            //cout<<a1<<' '<<a2<<' '<<b1<<endl;
            if(flag)
                continue;
            if(b1>=y1||b1<y2){//if(!in(b1-y1)||!in(b1-y2)){
               // cout<<1<<' '<<i<<' '<<n<<endl;
                n--;
                i--;
                //cout<<1<<' '<<i<<' '<<n<<endl;
            }
            else{
                if(b1==y2){//if(!in(b1-y2)){
                    //cout<<2<<' '<<i<<' '<<n<<endl;
                    xy[i].x1=a1;
                    xy[i].x2=a2;
                    //cout<<2<<' '<<i<<' '<<n<<endl;
                }
                else{
                    cal(xy[i].x1,x12,a1,b1,y2);
                    cal(xy[i].x2,x11,a2,b1,y2);
                }
                if(xy[i].x1<=x21&&xy[i].x2>=x22){
                    //cout<<i<<' '<<xy[i].x1<<' '<<xy[i].x2<<endl;
                    flag=true;
                    continue;
                }


            }
        }
        if(flag){
            cout<<"No View"<<endl;
            continue;
        }
        qsort(xy,n,sizeof(xy[0]),cmp);
        double d=0;
         for(i=0;i<n;i++){
            if(x21==x22)//if(!in(x21,x22))
            break;
            if(xy[i].x1>=x22||xy[i].x2<=x21){
                continue;
            }
            if(d<xy[i].x1-x21){
                d=xy[i].x1-x21;
            }
            x21=xy[i].x2>x22?x22:xy[i].x2;
        }
        if(d<x22-x21){
            d=x22-x21;
            //cout<<1<<endl;
        }
        //cout<<i<<endl;
        //cout<<d<<endl;
        if(d<=0){
            cout<<"No View"<<endl;
        }
        else{
            printf("%.2lf\n",d);
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值