模板:給定l1上兩點(ax,ay),(bx,by),l2上兩點(cx,cy),(dx,dy),求兩直線交點(x,y)。
double1039cross(
double
x1,
double
y1,
double
x2,
double
y2)void
intersec(point a, point b, point c, point d,
double
*x,
double*y)
accepted
200k
63ms
63ms是有些慢,這一題是劉汝佳的《演算法藝術與資訊學競賽》p359的例題。
思路:列舉上下兩個頂點成光線所在直線,然後判斷光線是否合法,合法的話列舉判斷光線與管道上下壁是否相交,並存下最遠的交點橫座標。
**
#include<
iostream
>
#include
<
cmath
>
using
namespace
std;
#define
maxn 25
#define
eps 1e-8
struct
point
point
operator-(
const
point
&a)
const
double
operator*(
const
point
&a)
const
void
input()
}upper[maxn],botto[maxn];
intn;
intsgn(
double
x)void
intersec(point a, point b, point c, point d,
double
*x,
double*y)
//判斷直線l(a,b)和線段l(up,down)是否相交
bool
check(point a,point b,point up,point down)
void
slove()
if(k
>=1)
continue
;for(k=
1;k<=
n;k++)if
(k>
n) intersec(upper[i],botto[j],upper[k-1
],upper[k],
&tx,
&ty);
if(sgn(tx
-upper[k-1
].x)
>=0&&
sgn(tx
-upper[k].x)
<=0)
if(maxx
<
tx) maxx
=tx;
intersec(upper[i],botto[j],botto[k-1
],botto[k],
&tx,
&ty);
if(sgn(tx
-botto[k-1
].x)
>=0&&
sgn(tx
-botto[k].x)
<=0)
if(maxx
<
tx) maxx
=tx;}if
(flag)
break;}
if(flag) puts(
"through all the pipe.");
else
printf(
"%.2lf\n
",maxx);
}int
main()
slove();
}return0;
}
pku 1039 Pipe 叉積的應用
黑書上的一道題目 題意 有一寬度為1的折線管道,上面頂點為 xi,yi 所對應的下面頂點為 xi,yi 1 假設管道都是不透明的,不反射的,光線從左邊入口處的 x0,y0 x,y0 1 之間射入,向四面八方傳播,求解光線最遠能傳播到 取x座標 或者是否能穿透整個管道.如果一根光線自始至終都未擦到任何...
poj 1039 Pipe (計算幾何)
題目 劉汝佳的黑書 演算法藝術與資訊學競賽 上的第3章計算幾何初步的例2 管道問題 有一寬度為1的折線管道,上面頂點為 xi,yi 所對應的下面頂點為 xi,yi 1 假設管道都是不透明的,不反射的,光線從左邊入口處的 x1,y1 x1,y1 1 之間射入,向四面八方傳播,求解光線最遠能傳播到 取x...
POJ 1039 Pipe(計算幾何)
有一寬度為1的折線管道,上面頂點為 xi,yi 所對應的下面頂點為 xi,yi 1 假設管道都是不透明的,不反射的,光線從左邊入口處的 x1,y1 x1,y1 1 之間射入,向四面八方傳播,求解光線最遠能傳播到 取x座標 或者是否能穿透整個管道。最遠的直線必定經過乙個上折點和乙個下折點。列舉這兩個點...