POJ 3340
来源:互联网 发布:bp神经网络算法 公式 编辑:程序博客网 时间:2024/05/22 00:19
http://poj.org/problem?id=3304
求多条的线段的投影是否有公共部分
如果存在一条直线与所有线段相交,则所有的线段的投影有公共部分
枚举所有的端点,即枚举直线 然后枚举所有线段看是否存在所有相交的情况
若存在,则直接跳出,否则接着枚举直线
要注意的是,题目要求如果俩个点之间的距离小于10-8,则认为两个点是同一个点
#include<stdio.h>#include<math.h>#include<string.h>#define M 110#define eps 1e-8struct point {double x,y;}po[M*2];struct lineseg{point a,b;}line[M];double Getlen(point a,point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}double multi(point a,point b,lineseg L) {double x1=a.x-b.x;double y1=a.y-b.y;double x2=a.x-L.a.x;double y2=a.y-L.a.y;double x3=a.x-L.b.x;double y3=a.y-L.b.y;return ((x1*y2-x2*y1)*(x1*y3-y1*x3));}bool Judge(lineseg L,point a,point b)//判断直线ab和线段L是否相交 {if(multi(a,b,L)<=eps)//判断线段L的两个端点是否在直线的两边return true;return false;}int main(){int cas;int n;int i,j,k;scanf("%d",&cas);while(cas--){scanf("%d",&n);for(i=0;i<n;i++){scanf("%lf%lf%lf%lf",&po[i*2].x,&po[i*2].y,&po[i*2+1].x,&po[i*2+1].y);line[i].a=po[i*2];line[i].b=po[i*2+1];}if(n==1||n==2){printf("Yes!\n");continue;}bool flag=false;for(i=0;i<n*2;i++){for(j=i+1;j<n*2;j++)//枚举两个点 {if(Getlen(po[i],po[j])<=eps)//若两点间距离小于1e-8,认为这两点是同一个点 continue;for(k=0;k<n;k++)//枚举线段 if(!Judge(line[k],po[i],po[j]))break;if(k==n) flag=true;if(flag) break;}if(flag) break;}if(flag)printf("Yes!\n");else printf("No!\n");}return 0;}
- poj 3340
- POJ 3340
- poj-3340
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- fread-fwrite array
- 编程经典收藏(Java篇)
- BASH系列之三if语句
- BASH系列之四比较和判断语句
- NO.66 AR Tools-开发人员常用小工具,总有一款适合你
- POJ 3340
- 2011-8-13 16:34:40
- MySQL Replication, 主从和双主配置
- BASH系列之五循环语句
- tape & reel 是什么?
- BASH系列之六case语句
- TopCoder新手完全教程
- 编程经典收藏(数据库篇)
- NO.67 AR Tools-目录树生成工具