POJ 3304 Segments 簡單幾何

2021-10-02 09:41:37 字數 1311 閱讀 9939

題目大意:給出n條線段,現在問是否存在一條直線,使得所有線段向這條直線的投影存在乙個共同的交點

題目分析:題意有點抽象,需要轉換一下,因為所有的線段向某一條直線的投影存在乙個交點,那麼在那條直線上,從交點位置開始,沿著垂直於直線的方向做另一條直線,會發現這條直線與n條線段都存在乙個交點,也就是都相交,這樣題目就轉換為了是否存在一條直線,使得與n條線段都有交點

因為直線也是由兩個點組成的,我們列舉所有線段上的點,作為構成直線上的兩個點,每次判斷一下是否滿足條件即可,時間複雜度為(2*n)*(2*n)*n,因為n比較小,所以直接實現就行了

有個細節需要注意一下,可能會有兩個點重合的情況,這個時候需要特判一下

**:

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const int n=110;

const double eps = 1e-8;

int n;

int sgn(double x)

struct point

point(double _x,double _y)

void input()

double distance(point p)

point operator -(const point &b)const

//叉積

double operator ^(const point &b)const

//點積

double operator *(const point &b)const

};struct line

line(point _s,point _e)

void input()

//`直線和線段相交判斷`

//`-*this line -v seg`

//`2 規範相交`

//`1 非規範相交`

//`0 不相交`

int linecrossseg(line v)

}line[n];

bool check(line l)

int main()

for(int i=0;ifor(int j=0;jif(check(line(point[i],point[j])))

puts("no!");

end:; }

return 0;

}

POJ 3304 Segments(計算幾何)

description 給出n條線段,問是否存在一條直線與這n條線段的任一條都相交 input 第一行一整數t表示用例組數,每組用例首先輸入一整數n表示線段數量,之後n行每行四個實數x1,y1,x2,y2分別表示線段兩端點橫縱座標 output 對於每組用例,如果存在一條直線與這n條線段的任一條都相...

poj3304 Segments 計算幾何

poj 3304 最近開始刷計算幾何了 公式好多完全不會 數學不行 幾何不行 記憶力不行 當機 查的題解 就當複習吧 這套專題拿來熟悉一下計算幾何模板 include include includeusing namespace std const double eps 1e 8 int sgn d...

POJ 3304 Segments 基礎線段交判斷

link 題意 詢問是否存在直線,使得所有線段在其上的投影擁有公共點 思路 如果投影擁有公共區域,那麼從投影的公共區域作垂線,顯然能夠與所有線段相交,那麼題目轉換為詢問是否存在直線與所有線段相交。判斷相交先求叉積再用跨立實驗。列舉每個線段的起始結束點作為直線起點終點遍歷即可。date 2017 07...