POJ 3304(计算几何初步——判断线段和直线相交,加上枚举)
2012-01-11 16:15
525 查看
这题有2点要注意:
一丶当n==1时,应特判输出YES
二丶精度控制,当2点的距离相差小于1E-8,近似看作同一点。
View Code
一丶当n==1时,应特判输出YES
二丶精度控制,当2点的距离相差小于1E-8,近似看作同一点。
View Code
#include<iostream> #include<cmath> #define EPS 1e-8 #define MAXN 104 using namespace std; struct point { double x, y; }; typedef point VECTOR; struct segment { point p[2]; }data[MAXN]; bool vis[MAXN]; double cross(point &p1, point &p2) { return p2.y*p1.x - p2.x*p1.y; } bool equal(point &sp, point &ep) { if (sqrt((sp.x - ep.x)*(sp.x - ep.x) + (sp.y - ep.y)*(sp.y - ep.y)) < EPS)return true; return false; } bool check(point &sp, point &ep, int n) { for (int i(0); i<n; ++i) { if (!vis[i]) { VECTOR fir, sec, thr; fir.x = data[i].p[0].x - sp.x; fir.y = data[i].p[0].y - sp.y; sec.x = ep.x - sp.x; sec.y = ep.y - sp.y; thr.x = data[i].p[1].x - sp.x; thr.y = data[i].p[1].y - sp.y; if (cross(fir, sec)*cross(sec, thr) < -EPS)return false; } } return true; } bool judge(int n) { for (int i(0); i<n; ++i) { vis[i] = true; for (int num = 0; num<2; ++num) { for (int j(i+1); j<n; ++j) { for (int cnt = 0; cnt<2; ++cnt) { if (!equal(data[i].p[num],data[j].p[cnt])) { vis[j] = true; if (check(data[i].p[num],data[j].p[cnt],n))return true; vis[j] = false; } } } } vis[i] = false; } return false; } int main() { int T; scanf("%d",&T); while (T--) { memset(vis,false,sizeof(vis)); int n; scanf("%d",&n); for (int i(0); i<n; ++i) { scanf("%lf%lf%lf%lf",&data[i].p[0].x,&data[i].p[0].y,&data[i].p[1].x,&data[i].p[1].y); } if (n == 1) { cout<<"Yes!\n"; continue; } if (judge(n)) { cout<<"Yes!\n"; } else { cout<<"No!\n"; } } return 0; }
相关文章推荐
- POJ 3304 Segments(计算几何 判断直线与线段相交)
- POJ 3304 Segments <计算几何(直线与线段相交判断)>
- POJ 1039——计算几何初步(判断线段与直线相交)
- POJ 3304 Segments [枚举+叉乘判断线段相交]【计算几何】
- POJ 3304 Segments (计算几何、判断直线与线段是否相交)
- POJ 1410(计算几何初步——判断线段与矩形相交,条件恶心的一B啊,又没说清楚)
- POJ 3304 Segments(计算几何:直线与线段相交)
- POJ 3304 计算几何 直线与线段相交
- POJ 3304:Segments 计算几何 是否有直线与所有线段相交
- POJ 3304 Segments(计算几何:直线与线段相交)
- Segments - POJ 3304 (判断直线与线段是否相交)
- poj 3304 Segments(判断直线与线段相交)
- POJ 3304 直线与线段相交的判断
- POJ 3304 Segments(判断直线和线段相交)
- poj 3304 判断是否存在一条直线与所有线段相交
- POJ 3304 Segments (直线和线段相交判断)
- POJ 1410 Intersection <计算几何(线段相交判断)>
- POJ 3304 Segments (直线和线段相交判断)
- POJ 3304 Segments 枚举线段端点+判断相交
- POJ 3304 Segments [判断线段和直线相交]