您的位置:首页 > 其它

POJ 1039 Pipe 简单的叉乘

2013-11-12 01:03 288 查看
题意:给你一段弯弯曲曲的管子,问是否存在一条光线可以穿过整条管子,如果存在,则输出“Through all the pipe”,否则输出X轴正方向光线最远能到的X轴坐标。

思路:如果存在这样一束光线,则此束光线必过管子的两个节点。如果不存在,最远的那一丝光线也必过管子的两个的节点,所以剩下的任务就是无厘头的枚举了。

PS:我感觉我已经爱上熬夜了......

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <algorithm>
#include <string>

#define LL long long
#define Max(a,b) (a) > (b) ? (a) : (b)
#define Min(a,b) (a) < (b) ? (a) : (b)
#define EPS (1e-8)
#define Left true
#define Right false

using namespace std;

struct P
{
double x,y;
}p[40][2];

double X_Mul(P a1,P a2,P b1, P b2)
{
P v1 = {a2.x-a1.x,a2.y-a1.y},v2 = {b2.x-b1.x,b2.y-b1.y};
return (v1.x*v2.y - v2.x*v1.y);
}

bool Is_Through(P p1,P p2,int n)
{
int i;
for(i = 0;i < n; ++i)
{
if(X_Mul(p1,p2,p1,p[i][0]) < (-EPS))
return false;
}
for(i = 0;i < n; ++i)
{
if(X_Mul(p1,p2,p1,p[i][1]) > EPS)
return false;
}
return true;
}

double Cal_Position(P a1,P a2,P b1,P b2)
{
double t = fabs(X_Mul(a1,a2,a1,b1))/fabs(X_Mul(a1,a2,b1,b2));

return b1.x + (b2.x - b1.x)*t;
}

double Cal_Len(P p1,P p2,int n,int s,int e)
{
int i;

for(i = 0;i < s; ++i)
{
if(X_Mul(p1,p2,p1,p[i][0]) < (-EPS) || X_Mul(p1,p2,p1,p[i][1]) > EPS )
return p[0][0].x;

//此时表明此光线不存在
}
for(i = s+1;i < e; ++i)
{
if(X_Mul(p1,p2,p1,p[i][0]) < (-EPS) || X_Mul(p1,p2,p1,p[i][1]) > EPS )
return p[0][0].x;

//此时表明此光线不存在
}

for(i = e+1;i < n; ++i)
{
if(X_Mul(p1,p2,p1,p[i][0]) < EPS)
{
return Cal_Position(p1,p2,p[i-1][0],p[i][0]);
}
else if(X_Mul(p1,p2,p1,p[i][1]) > EPS )
{
return Cal_Position(p1,p2,p[i-1][1],p[i][1]);
}
}
return p[0][0].x;
}

void output(int n)
{
int i,j;
for(i = 0;i < n; ++i)
{
for(j = i+1;j < n; ++j)
{
if(Is_Through(p[i][0],p[j][0],n) || Is_Through(p[i][1],p[j][0],n) || Is_Through(p[i][0],p[j][1],n)|| Is_Through(p[i][1],p[j][1],n))
{
cout<<"Through all the pipe."<<endl;
return ;
}
}
}
double Temp,Max = p[0][0].x;
for(i = 0;i < n; ++i)
{
for(j = i+1;j < n; ++j)
{
Temp = Cal_Len(p[i][0],p[j][0],n,i,j);
Max = Max(Temp,Max);
Temp = Cal_Len(p[i][1],p[j][0],n,i,j);
Max = Max(Temp,Max);
Temp = Cal_Len(p[i][0],p[j][1],n,i,j);
Max = Max(Temp,Max);
Temp = Cal_Len(p[i][1],p[j][1],n,i,j);
Max = Max(Temp,Max);
}
printf("%.2f\n",Max);
return ;
}

int main()
{
int n,i;
while(scanf("%d",&n) && n)
{
for(i = 0;i < n; ++i)
{
scanf("%lf %lf",&p[i][0].x,&p[i][0].y);
p[i][1] = p[i][0];
p[i][1].y--;
}

output(n);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: