POJ 2074 线段相交 视线问题

简介:

题意:给你一个代表房子的线段,代表路的线段,然后代表各种障碍物的线段。求出路上最长的区间,在区间中能看到完整的房子。

首先筛选出纵坐标在房子与路之间的,再根据视线完全能看到就行了。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef double PointType;
struct point
{
    PointType x,y;
};
struct line
{
    point l,r;
};
line house,road,data[200],ans[200];
int ansnum,n,num;
void getcoor(line &ans,double x1,double x2,double y)  //构建点坐标
{
    ans.l.x=x1,ans.r.x=x2;
    ans.l.y=ans.r.y=y;
}
point getpoint(point a,point b)   //求在路上的交点
{
    point wans;
    double k,b1;
    if(a.x==b.x)
        wans.x=a.x;
    else
        k=(a.y-b.y)/(a.x-b.x),
          b1=a.y-k*a.x,
             wans.x=(road.l.y-b1)/k;
    wans.y=road.l.y;
    return wans;
}
void getans(line a)  //将路上不可视区域转化成线段
{
    ans[ansnum].l=getpoint(a.l,house.r);
    ans[ansnum].r=getpoint(a.r,house.l);
    ansnum++;
}
int cmp(line a,line b)
{
    return a.l.x<b.l.x;
}
int main()
{
    double x1,x2,y;
    while(~scanf("%lf%lf%lf",&x1,&x2,&y),(x1||x2||y))
    {
        num=ansnum=0;
        getcoor(house,x1,x2,y);
        scanf("%lf%lf%lf",&x1,&x2,&y),getcoor(road,x1,x2,y);
        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {
            scanf("%lf%lf%lf",&x1,&x2,&y);
            if(y<house.l.y&&y>=road.l.y) //筛选线段在房子和路之间的障碍物
                getcoor(data[num++],x1,x2,y),getans(data[num-1]);
        }
        if(n==0)
        {
            printf("%.2f\n",road.r.x-road.l.x);
            continue;
        }
        getcoor(ans[ansnum++],-9999999,road.l.x,road.l.y);
        getcoor(ans[ansnum++],road.r.x,9999999,road.l.y);
        sort(ans,ans+ansnum,cmp);
        double ansmax=0,bj=ans[0].r.x;
        for(int i=0; i<ansnum; i++)
        {
            if(ans[i].l.x>bj)
                ansmax=max(ansmax,ans[i].l.x-bj);
            bj=max(ans[i].r.x,bj);
        }
        if(ansmax==0)
            puts("No View");
        else
            printf("%.2f\n",ansmax);
    }
    return 0;
}




目录
相关文章
|
2月前
LeetCode题:174. 地下城游戏
LeetCode题:174. 地下城游戏
35 0
LeetCode题:174. 地下城游戏
|
6月前
|
算法
【学会动态规划】地下城游戏(10)
【学会动态规划】地下城游戏(10)
22 0
|
8月前
动态规划之地下城游戏
动态规划之地下城游戏
|
12月前
J - 食物链 POJ - 1182
J - 食物链 POJ - 1182
67 0
LeetCode 2101. 引爆最多的炸弹(图的遍历)
LeetCode 2101. 引爆最多的炸弹(图的遍历)
200 0
LeetCode 2101. 引爆最多的炸弹(图的遍历)
|
算法 开发者
算法笔试模拟题精解之“正三角塔”
这是一个数学问题,将三角塔多写出几层后就可以发现规律。
算法笔试模拟题精解之“正三角塔”
|
算法 人工智能
洛谷 P2765 魔术球问题
题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球。 (1)每次只能在某根柱子的最上面放球。 (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数。
1030 0
|
人工智能 BI
洛谷 P3183 BZOJ 4562 [HAOI2016]食物链
题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数。物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a3 b3......am-1 bm-1am bm其中ai bi表示能量从物种ai流向物种bi,注意单独的一种孤立生物不算一条食物链 输入输出格式 输入格式:   第一行两个整数n和m,接下来m行每行两个整数ai bi描述m条能量流动关系。
1007 0