poj 3304 Segments (几何 : 线段 直线相交)
生活随笔
收集整理的這篇文章主要介紹了
poj 3304 Segments (几何 : 线段 直线相交)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://poj.org/problem?id=3304
?
?
題意:求是否存在一條直線,使所有線段到這條直線的投影至少有一個交點。?
題解“:
?
1:把問題轉化為是否存在一條直線與每條線段都有交點。證明:若存在一條直線l和所有線段相交,作一條直線m和l垂直,則m就是題中要求的直線,所有線段投影的一個公共點即為垂足。
??
所以我們只要枚舉所有的端點構成的直線 ,就可以了,叉積 判斷 是否直線和線段相交。
?
2:枚舉兩兩線段的各一個端點,連一條直線,再判斷剩下的線段是否都和這條直線有交點。證明:若有l和所有線段相交,則可保持l和所有線段相交,上下 平移l到和某一線段交于端點停止(“移不動了”)。然后繞這個交點旋轉。也是轉到“轉不動了”(和另一線段交于其一個端點)為止。這樣就找到了一個新的l滿足題意,而且經過其中兩線段的端點。
?
??1?#include<cstdio>??2?#include<cstring>
??3?#include<cmath>
??4?#include<iostream>
??5?#include<algorithm>
??6?#include<set>
??7?#include<map>
??8?#include<queue>
??9?#include<vector>
?10?#include<string>
?11?#define?Min(a,b)?a<b?a:b
?12?#define?Max(a,b)?a>b?a:b
?13?#define?CL(a,num)?memset(a,num,sizeof(a));
?14?#define?maxn??120
?15?#define?eps??1e-8
?16?#define?inf?100000000
?17?#define?mx?1<<60
?18?#define?ll???__int64
?19?using?namespace?std;
?20?
?21?struct?point
?22?{
?23?????double?x;
?24?????double?y;
?25?}up[maxn],dp[maxn],p[maxn*2];
?26?double?ans?;
?27?int??n,num?;
?28?int?dbcmp(double?x)
?29?{
?30?????if(fabs(x)?<?eps)?return?0;
?31?????if(x<?0)?return?-1;
?32?????else??return?1?;
?33?
?34?}
?35?double?det(double?x1,double?y1,double?x2,double?y2)
?36?{
?37?????return?x1*y2?-?x2*y1?;
?38?}
?39?double?cross(point?a,point?b,point?c)
?40?{
?41?????return?det(b.x?-?a.x,b.y?-?a.y,c.x?-?a.x,c.y?-?a.y);
?42?}
?43
?51?bool??solve(?)
?52?{
?53?
?54????int?i,j,k;
?55????for(i?=?0?;?i<?num;i++)
?56????{
?57????????for(j?=?0?;?j?<?num;j++)
?58????????{
?59????????????if(i?==?j)continue?;
?60?????????????if(sqrt((p[i].x?-?p[j].x)*(p[i].x?-?p[j].x)?+?(p[i].y?-?p[j].y)*(p[i].y?-?p[j].y))?<?eps)continue?;//注意這個判斷 錯在這好幾次
?61???????????int?f?=?0?;
?62???????????for(k?=?0?;?k?<?n;k++)
?63???????????{
?64???????????????if(dbcmp(cross(p[i],p[j],up[k]))*dbcmp(cross(p[i],p[j],dp[k]))??>?0)
?65???????????????{
?66???????????????????f?=?1;
?67?????????????????????break;
?68???????????????}
?69?
?70?
?71???????????}
?72???????????if(f?==?0)?return?true?;
?73?
?74????????}
?75????}
?76????return?false?;
?77?
?78?}
?79?
?80?int?main()
?81?{
?82?????int?i,j;
?83?????//freopen("data.txt","r",stdin);
?84?????int??t;
?85?????scanf("%d",&t);
?86?
?87?????while(t--)
?88?????{
?89?????????scanf("%d",&n);
?90?????????num?=?0?;
?91?
?92?????????for(i?=?0;i<?n;i++)
?93?????????{
?94?????????????scanf("%lf?%lf?%lf?%lf",&up[i].x,&up[i].y,&dp[i].x,&dp[i].y);
?95?????????????p[num].x?=?up[i].x;
?96?????????????p[num].y?=?up[i].y?;
?97?????????????num++;
?98?????????????p[num].x?=?dp[i].x;
?99?????????????p[num].y?=?dp[i].y?;
100?????????????num?++;
101?
102?
103?
104?????????}
105?????????if(n?==?1||?n?==?2)
106?????????{
107?????????????puts("Yes!");
108?
109?????????????continue?;
110?
111?????????}
112?????????bool?f?=?false?;
113?????????f?=?solve()?;
114?????????if(f)puts("Yes!");
115?????????else?puts("No!");
116?????}
117?}
?
??
轉載于:https://www.cnblogs.com/acSzz/archive/2012/08/26/2657724.html
總結
以上是生活随笔為你收集整理的poj 3304 Segments (几何 : 线段 直线相交)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转帖]如何在quartusII中调用m
- 下一篇: AbsoluteLayout 相框