題目大意:給出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...