poj 1039 Pipes 線段相交求交點

2021-09-07 22:03:00 字數 2461 閱讀 2562

題意:

無反射不透明管子, 問從入口射入的所有光線最遠能到達的橫座標. 貫穿也可.

思路:列舉每一組經過 up [ i ] 和 down [ j ] 的直線, 計算最遠點.

因為無法按照光線生成的方式確定點斜式的起始點及斜率(連續的), 於是換另一種思路:

反正最終是要判斷可行的直線, 就直接選擇一些有代表性的直線, 覆蓋所有邊界即可.

於是考慮邊界是什麼.

首先可以發現: 由於光線是入口整個發出的, 其實也就是入口和拐點是平等的. 只要判相交.

只要覆蓋在整個管道範圍內的直線就可以, 由於不知道管道的形狀特點, 只能暴力列舉每一組上下界. 能夠完全穿過的直線就取"恰好與出口的一端相交"的情況.

這樣做就將當前所列舉的兩端點視為一段管道, 當前直線可以穿過當前等效管道, 判別是否可以穿過其他管道(包括等效管道內部的真實管道). 

也就是將一系列判別滿足的問題拆分為, 保證單個問題滿足, 並用此一單個問題 粗略劃定的範圍去測試其它. 這樣就解決了用來測試的範圍無從確定的障礙.

難點就在於想到如何遍歷所有可行的直線.

//memory  time

//456k 63ms

#include#include#includeusing namespace std;

const double precision=1e-3; //精度限制

const double inf=99999.0; //正無窮,注意下面使用的是負無窮

typedef class node //折點座標

point;

int max(int a,int b)

/*把浮點p的值轉化為0,1或-1 (精度討論)*/

int dblcmp(double p)

/*叉積運算*/

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

/*計算p點在ab的順側還是逆側*/

double cross(point a,point b,point p)//ab x ap

/*判斷直線ab與線段cd是否相交*/

bool check(point a,point b,point c,point d)

/*計算直線ab和線段cd的交點橫座標*/

double intersection(point a,point b,point c,point d)

return -inf; //cd在ab同側,無交點,返回 負無窮

}int main()

bool flag=false; //標記當前光線l(直線up[i]->down[j])能否貫通全管

for(i=1;i<=n;i++) //列舉所有通過乙個上折點、乙個下折點的直線

else if(k>max(i,j)) //判斷與第k-1節管子的上管壁還是下管壁相交

}if(flag)

break;

} if(flag)

cout<

#include #include using namespace std;

const double eps = 1e-6;///寫成int了= =

const int inf = 0x3f3f3f3f;

const int maxn = 25;

typedef struct node

point;

point up[maxn],down[maxn];

int max(int a, int b)

int dcmp(double p)

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

double cross(point a, point b, point p)

bool check(point a, point b, point c, point d)

double intersection(point a, point b, point c, point d)

if(!(c*d))

return -inf;

}int main()

bool flag = false;

for(int i=1;i<=n;i++)

if(k>n)

if(k>max(i,j))

}if(flag)

break;

}if(flag)

printf("through all the pipe.\n");

else

printf("%.2lf\n",mx);}}

POJ 1039 Pipe 線段相交

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

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

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

POJ3304 Segments 線段直線相交

題意 給出n條線段兩個端點的座標,問所有線段投影到一條直線上,如果這些所有投影至少相交於一點就輸出yes!否則輸出no!思路 計算幾何。這道題要思考到兩點 1 把問題轉化為是否存在一條直線與每條線段都有交點。證明 若存在一條直線l和所有線段相交,作一條直線m和l垂直,則m就是題中要求的直線,所有線段...