是否存在一條直線使所有已知線段在該條直線上的投影至少有乙個公共點。線段個數n<=100。
1.這個問題
等價於 是否存在乙個直線可以與所有的線段至少有乙個端點。(若投影有公共點,那麼投影的直線的垂線與線段都相交)
等價於 已知的線段的端點組成的集合n,是否可以在集合n中找到兩個端點形成一條直線與所有線段相交。(想一想就知道了)
2.n很小,通過暴力列舉端點構成的直線,判斷直線是否與線段相交,這個通過叉積同號排除相交的可能。
端點a和b確定的直線,判斷端點c和d確定的線段是否與直線相交。(向量ca × 向量cb) * (向量ca × 向量cb) > 0表明c和d在直線的同側,那麼直線和線段不相交。若=0,則表明c和d至少有乙個端點在直線上,認為相交。若<0,則表明c和d在直線的異側,即相交。
#include#include#include#includeusing namespace std ;
#define n 105
struct seg
seg[n] ;
struct node
node[n * 2] ;
int n ;
double cal(double x , double y , double x1 , double y1 , double x2 , double y2)
bool judge(int a , int b)
return 1 ;
}int main()
flag = 0 ;
for(i = 0 ; i < 2 * n - 1 ; i ++)
for(j = i + 1 ; j < 2 * n ; j ++)
if(judge(i , j))
if(flag)
printf("yes!\n") ;
else
printf("no!\n") ;
} }
叉積判斷線段 直線相交 POJ3304
給你n個線段的兩端座標 問是否存在一條直線 所有線段在這條直線上的投影有共同點 存在一條直線 所有線段在這條直線上的投影有共同點 有一條線能穿過所有線段 這兩條直線剛好 暴力列舉所有端點 直線與線段相交 叉積 判斷一次就夠啦 線段與線段相交 twice include include include...
poj3304(叉積判斷直線和線段相交)
題意 求是否能找到一條直線,使得n條線段在該直線的投影有公共點。思路 如果存在這樣的直線,那麼在公共投影點作直線的垂線,顯然該垂線會經過所有直線,那麼原題轉換為求是否有經過所有線段的直線。如果存在這樣的直線,那麼該直線一定能通過平移和旋轉之後經過所有線段中的兩個端點,那麼我們列舉所有兩兩線段的端點作...
POJ 1018 列舉 貪心
題意 有n件商品,每件商品有m個製造商,每個製造商製造的商品有不同的 頻寬和 每件商品必須選乙個製造商,最後的頻寬是所有頻寬中的最小值,價值是所有商品的總 目的是使b p最大,輸出最大的b p的值。思路 由於資料範圍比較小,所以可以列舉。可以求出所有製造商的商品的最大頻寬和最小頻寬,然後列舉在兩者之...