poj 1039 Pipe (計算幾何)

2022-07-16 18:39:10 字數 1682 閱讀 6436

題目:

劉汝佳的黑書《演算法藝術與資訊學競賽》上的第3章計算幾何初步的例2  管道問題

有一寬度為1的折線管道,上面頂點為(xi,yi),所對應的下面頂點為(xi,yi-1),假設管道都是不透明的,不反射的,光線從左邊入口處的(x1,y1),(x1,y1-1)之間射入,向四面八方傳播,求解光線最遠能傳播到**(取x座標)或者是否能穿透整個管道.

思路:首先,一根光纖自始至終未曾擦到任何頂點,肯定不是最優的(可以平移使之優化),然後,如果只碰到乙個頂點,那也不是最優的,可以通過旋轉,是他碰到另乙個頂點,並且更優,最後要說明,最優光線必然是擦到乙個上頂點,乙個下頂點。。。。

任取乙個上頂點乙個下頂點形成直線l,然後從左到右依次判斷管壁與其相不相交,若相交停止迴圈找出交點與之前的交點比較,找到最大的x即可,若一直都不想交則就是l射穿了整個管道。。。

**:view code

1 #include 2 #include3 #include4

using

namespace

std;

5 typedef struct

node

6point;

9 point up[31

];10 point down[31

];11

const

double eps=1e-8;12

const

double inf=99999.0;13

int max(int a,int

b)14

20int dblcmp(double d)//

浮點誤差的處理

2126

double det (double x1,double y1,double x2,double y2)//

叉乘27

3031

double

cross(point a,point b,point c)

3235

36int

pan(point a,point b,point c,point d)

3740

41double get_x(point a,point b,point c,point d)//

求交點42

56return -inf;//

不相交57}58

intmain()

5972

//依次列舉每個點

73int flag=0;74

double res=-inf;//

初始化為最小負數,因為座標可能為負的

75int

k;76

for(i=0;i)

7787

if(k>=n)//

穿過全部的管道

8892

else

93103

104}

105}

106if

(flag)

107break

;108

}109

if(flag==1

)110 printf("

through all the pipe.\n");

111else

112 printf("

%.2f\n

",res);

113}

114return0;

115 }

POJ 1039 Pipe(計算幾何)

有一寬度為1的折線管道,上面頂點為 xi,yi 所對應的下面頂點為 xi,yi 1 假設管道都是不透明的,不反射的,光線從左邊入口處的 x1,y1 x1,y1 1 之間射入,向四面八方傳播,求解光線最遠能傳播到 取x座標 或者是否能穿透整個管道。最遠的直線必定經過乙個上折點和乙個下折點。列舉這兩個點...

POJ 1039 Pipe 線段相交

題目 給乙個管子,有很多轉彎處,問從管口的射線射進去最長能射到多遠 題解 根據黑書,可以證明的是這條光線一定經過了乙個上頂點和下頂點 所以我們列舉每對上下頂點就可以了 include include include include define eps 1e 5 using namespace st...

POJ 1039 Pipe (列舉,判線段相交)

題目大意 一根由平行線段組成的管道,給出管道的上端折點,下端折點比上端折點高度少1。有一束光從入口射入,求可以照到的最遠位置。思路 列舉任意兩點,從入口處開始判斷光線是否通過折點出 即與折點豎直線段相交 記錄最遠位置並判斷,輸出即可。開始腦抽,總覺的光要沿著入口上下點射入。放了三天果斷1a了。mem...