poj2074 라인이 교차하는 시선 문제

3266 단어
각 장애물의 선단에 가려진 구간을 구하고 나머지 구역 중 가장 긴 구간을 구한다. 여기서 -1+1의 사상을 이용하여 코드를 구체적으로 보자.
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
#define rd(x) scanf("%d",&x)
#define rdd(x,y) scanf("%d%d",&x,&y)
#define rddd(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define rdddd(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)
#define rds(s) scanf("%s",s)
#define rep(i,n) for(int i=0;i<n;i++)
#define LL long long
const int N = 1000;
const int M=2000;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
int MOD=1e9+7;
int cas=1;
int n,m,k,q;
struct Point{
    double x,y;
    Point(){}
    Point(double _x,double _y){
        x=_x;
        y=_y;
    }
    void print(){
        printf("x: %lf y: %lf
",x,y); } }; struct Seg{ Point s,e; Seg(){} Seg(Point _s,Point _e){ s=_s;e=_e; } Seg(double a,double b,double c,double d){ s.x=a;s.y=b; e.x=c;e.y=d; } }; int sgn(double x) {return x<-eps?-1:x<eps?0:1;} double cross(Point a,Point b,Point c){ return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x); } Point inter(Seg a,Seg b){ Point p1,p2,p3,p4; p1=a.s;p2=a.e;p3=b.s;p4=b.e; double a1=p1.y-p2.y; double b1=p2.x-p1.x; double c1=p1.x*p2.y-p2.x*p1.y; double a2=p3.y-p4.y; double b2=p4.x-p3.x; double c2=p3.x*p4.y-p4.x*p3.y; double x=(c2*b1-c1*b2)/(a1*b2-a2*b1); double y=(c2*a1-c1*a2)/(a2*b1-a1*b2); return Point(x,y); } Seg house,pro; Seg seg; double h1,h2; double l,r; struct node{ double pos; int val; bool operator < (const node& o) const { return pos<o.pos; } }c[N]; int main() { #ifndef ONLINE_JUDGE freopen("aaa","r",stdin); #endif int T; double u,v,w; while(1){ scanf("%lf%lf%lf",&u,&v,&w); if(u==0 && v==0 && w==0) break; house=Seg(u,w,v,w); h2=w; scanf("%lf%lf%lf",&u,&v,&w); pro=Seg(u,w,v,w); h1=w; l=u;r=v; rd(n); int cnt=0; for(int i=1;i<=n;i++){ scanf("%lf%lf%lf",&u,&v,&w); if(w>h1 && w<h2){ Point ret=inter(Seg(house.e,Point(u,w)),pro); double x1=ret.x; ret=inter(Seg(house.s,Point(v,w)),pro); double x2=ret.x; x2=min(x2,r); x1=max(x1,l); if(x1<=x2){ c[++cnt]=node{x1,-1}; c[++cnt]=node{x2,1}; } } } sort(c+1,c+1+cnt); double ret=0; double pre=l; int num=0; for(int i=1;i<=cnt;i++){ double p=c[i].pos; if(num>=0) ret=max(ret,p-pre); num+=c[i].val; pre=c[i].pos; } ret=max(ret,r-c[cnt].pos); if(sgn(ret)==0) puts("No View"); else printf("%.2f
",ret); } return 0; }

좋은 웹페이지 즐겨찾기