POJ 1039

一条直线,必定可以通过旋转和平移使得它和一个上顶点一下顶点相切,这样的直线是最优的。因为这样能确定了直线所能到达的最远X。这样的两个顶点就规定了它的上下界,

所以,枚举上下顶点,注意判断是否能到达入口处。只需判断直线是否与每个横切面的直线都有相交。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;
const double eps=0.00000001;
struct point{
	double x,y;
}up[30],dp[30];
struct edge{
	point start,end;
}Line;
int n;
double longest;

int dpcmp(double h){
	if(fabs(h)<eps) return 0;
	return h>0?1:-1;
}

bool cross(point a,point b,point c,point d){
	double h=(c.x-a.x)*(b.y-a.y)-(c.y-a.y)*(b.x-a.x);
	double j=(d.x-a.x)*(b.y-a.y)-(d.y-a.y)*(b.x-a.x);
	int s1=dpcmp(h); int s2=dpcmp(j);
	if(s1*s2<0)
	return true;
	else if(s1*s2==0){
		return true;
	}
	return false;
}

bool slove(int uper, int down){
	int i;
	for(i=0;i<n;i++)
		if(!cross(Line.start,Line.end,up[i],dp[i])) break;
		if(i>=n) {
			return true;
		}
		else if(i<max(uper,down)) return false;
		else{
			double x1=-90080000,x2=-90080000;
			double k1=(Line.end.y-Line.start.y)/(Line.end.x-Line.start.x);
			double k2=(up[i].y-up[i-1].y)/(up[i].x-up[i-1].x);
			double k3=(dp[i].y-dp[i-1].y)/(dp[i].x-dp[i-1].x);
			if(cross(Line.start,Line.end,up[i-1],up[i]))
			x1=(up[i].y-Line.end.y+k1*Line.end.x-k2*up[i].x)/(k1-k2);
			if(cross(Line.start,Line.end,dp[i-1],dp[i]))
			x2=(dp[i].y-Line.end.y+k1*Line.end.x-k3*dp[i].x)/(k1-k3);
			longest=max(longest,max(x1,x2));
			return false;
		}
}

int main(){
	while(scanf("%d",&n)!=EOF){
		if(n==0) break;
		longest=-90080000;
		for(int i=0;i<n;i++){
			scanf("%lf%lf",&up[i].x,&up[i].y);
			dp[i]=up[i]; dp[i].y=dp[i].y-1;
		}
		bool flag=false;
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++)
			if(i!=j){
				Line.start=up[i]; Line.end=dp[j];
				if(slove(i,j)){
					flag=true;
					break;
				}
			}
			if(flag)
			break;
		}
		if(flag) printf("Through all the pipe.\n");
		else printf("%.2f\n",longest);
	}
	return 0;
}

  

POJ 1039

时间: 2024-11-06 09:36:49

POJ 1039的相关文章

POJ - 1039 Pipe(计算几何)

http://poj.org/problem?id=1039 题意 有一宽度为1的折线管道,上面顶点为(xi,yi),所对应的下面顶点为(xi,yi-1),假设管道都是不透明的,不反射的,光线从左边入口处的(x1,y1),(x1,y1-1)之间射入,向四面八方传播,求解光线最远能传播到哪里(取x坐标)或者是否能穿透整个管道. 分析 最远的直线必定经过一个上折点和一个下折点.枚举这两个点即可. #include <iostream> #include <stdio.h> #inclu

Pipe - POJ 1039(线段相交交点)

题目大意:有一个不反光并且不透光的管道,现在有一束光线从最左端进入,问能达到的最右端是多少,输出x坐标. 分析:刚开始做是直接枚举两个点然后和管道进行相交查询,不过这样做需要考虑的太多,细节不容易掌控.后来发现其实只需要对接口进行一下相交查询就简单多了,因为只需要考虑能不能通过每个截口就可以了,而且这样做的好处还有没有平行线和重叠线的情况,因为所有的截口都是垂直于x轴的,换一种想法海阔太空啊. 代码如下: =============================================

POJ 1039 直线和线段相交

题意: 题意很好理解,从左边射过来的光线,最远能经过管道到右边多少距离. 分析: 光线一定经过一个上端点和一个下端点,这一点很容易想到.然后枚举上下端点即可 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define eps 1e-8 #define INF 1e9 #define OK sgn(tmp

poj 1039 Pipe(几何基础)

Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9932   Accepted: 3045 Description The GX Light Pipeline Company started to prepare bent pipes for the new transgalactic light pipeline. During the design phase of the new pipe shape th

POJ 1039问题描述

Description The GX Light Pipeline Company started to prepare bent pipes for the new transgalactic light pipeline. During the design phase of the new pipe shape the company ran into the problem of determining how far the light can reach inside each co

简单几何(直线与线段相交) POJ 1039 Pipe

题目传送门 题意:一根管道,有光源从入口发射,问光源最远到达的地方. 分析:黑书上的例题,解法是枚举任意的一个上顶点和一个下顶点(优化后),组成直线,如果直线与所有竖直线段有交点,则表示能穿过管道. /************************************************ * Author :Running_Time * Created Time :2015/10/31 星期六 10:28:12 * File Name :POJ_1039.cpp ***********

POJ 1039 Pipe 枚举线段相交

Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9493   Accepted: 2877 Description The GX Light Pipeline Company started to prepare bent pipes for the new transgalactic light pipeline. During the design phase of the new pipe shape th

poj 1039 Pipe (计算几何)

Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9110   Accepted: 2755 Description The GX Light Pipeline Company started to prepare bent pipes for the new transgalactic light pipeline. During the design phase of the new pipe shape th

POJ 1039 Pipe

题意:一根管子,中间有一些拐点,给出拐点的上坐标,下坐标为上坐标的纵坐标减1,管子不能透过光线也不能折射光线,问光线能射到最远的点的横坐标. 解法:光线射到最远处的时候一定最少经过两个拐点,枚举每两个顶点,判断最远光线射到的位置.代码姿势不够优美……都是眼泪啊 代码: #include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h&g