題意:求是否能找到一條直線,使得n條線段在該直線的投影有公共點。
思路:如果存在這樣的直線,那麼在公共投影點作直線的垂線,顯然該垂線會經過所有直線,那麼原題轉換為求是否有經過所有線段的直線。
如果存在這樣的直線,那麼該直線一定能通過平移和旋轉之後經過所有線段中的兩個端點,那麼我們列舉所有兩兩線段的端點作為直線的兩點,然後是判斷直線是否經過所有線段。如果線段為p0p1,直線為p2p3,那麼相交時滿足:(p0p2^p0p3)*(p1p2^p1p3)<=0。總複雜度為o(n^3)。
ac code:
#include#include#include
#include
using
namespace
std;
const
int maxn=105
;const
double eps=1e-8
;int
t,n,flag;
struct
point
point(
double xx,double
yy):x(xx),y(yy){}
point
operator + (const point& b)const
point
operator - (const point& b)const
double
operator * (const point& b)const
double
operator ^ (const point& b)const
};struct
line;
line(point ss,point ee)
}line[maxn];
int sgn(double
x)double
dist(point a,point b)
double xmult(point p0,point p1,point p2)
bool seg_inter_line(line l1,line l2)
bool
check(point p1,point p2)
intmain()
for(int i=1;i<=n;++i)
if(flag)
break
; }
if(flag) printf("
yes!\n");
else printf("
no!\n");
}return0;
}
叉積判斷線段 直線相交 POJ3304
給你n個線段的兩端座標 問是否存在一條直線 所有線段在這條直線上的投影有共同點 存在一條直線 所有線段在這條直線上的投影有共同點 有一條線能穿過所有線段 這兩條直線剛好 暴力列舉所有端點 直線與線段相交 叉積 判斷一次就夠啦 線段與線段相交 twice include include include...
poj 3304 判斷直線與線段相交
傳送門 題意 給你一些線段,然後問你是否存在一條直線,把這些線段投影到直線上,所投影與原線段至少有1個公共點。思路 由題意可得原線段與直線符合條件的直線至少有1個公共點,所以就轉化成是否有直線與所有線段相交的問題了。列舉任意兩個不同端點作為直線上兩點確定一直線判斷是否與所有直線相交即可。吐槽 距離小...
poj 3304 列舉 叉積
是否存在一條直線使所有已知線段在該條直線上的投影至少有乙個公共點。線段個數n 100。1.這個問題 等價於 是否存在乙個直線可以與所有的線段至少有乙個端點。若投影有公共點,那麼投影的直線的垂線與線段都相交 等價於 已知的線段的端點組成的集合n,是否可以在集合n中找到兩個端點形成一條直線與所有線段相交...