POJ 3304 Segments

大意:给你一些线段,找出一条直线可以穿过全部的线段,相交包含端点。

思路:遍历全部的端点,取两个点形成直线,推断直线是否与全部线段相交,假设存在这种直线,输出Yes。可是注意去重。

struct Point
{
double x, y;
} P[210];
struct Line
{
Point a, b;
} L[110]; double xmult(Point p1, Point p2, Point p)
{
return (p1.x-p.x)*(p2.y-p.y)-(p1.y-p.y)*(p2.x-p.x);
} bool segLineInter(Line seg, Line line)
{
double d1, d2;
d1 = xmult(seg.a, line.a, line.b);
d2 = xmult(seg.b, line.a, line.b);
if((d1>eps && d2 < -eps) || (d1 < -eps && d2 > eps))
return true;
if(fabs(d1) < eps || fabs(d2) < eps)
return true;
return false;
} int T;
int n; void Solve()
{
Line l1, l2;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
int t = 0;
for(int i = 0; i < n; ++i)
{
scanf("%lf%lf%lf%lf", &L[i].a.x, &L[i].a.y, &L[i].b.x, &L[i].b.y);
P[t++] = L[i].a;
P[t++] = L[i].b;
}
bool ans = false;
for(int i = 0; !ans && i < t; ++i)
{
for(int j = i+1; j < t; ++j)
{
bool flag = true;
if(fabs(P[i].x-P[j].x) < eps && fabs(P[i].y-P[j].y) < eps) continue;
for(int k = 0; k < n; ++k)
{
if(segLineInter(L[k], (Line){P[i], P[j]}) == false)
{
flag = false;
break;
}
}
if(flag == true)
{
ans = true;
break;
}
}
}
printf("%s!\n", ans?"Yes":"No");
}
}

最新文章

  1. Mac OS apache php配置
  2. wdcp 下apache模式开启https访问,支持多站点
  3. Spring Collections XML 配置
  4. perl常用代码
  5. Node.js 入门(2)
  6. jQuery.innerWidth() 函数详解
  7. Socket 基础解析使用ServerSocket建立聊天服务器
  8. PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
  9. 使用jmeter进行批量数据创建
  10. CMD远程连接服务器上的MySQL
  11. 《java入门第一季》模拟用户登陆注册案例集合版
  12. 通过&lt;meta&gt;标签指定IE的文档模式实现CSS3兼容
  13. apache Storm 学习笔记
  14. Linux 运维工作中的经典应用ansible(批量管理)Docker容器技术(环境的快速搭建)
  15. sass个人学习笔记
  16. CSS3-flex弹性布局之flex属性
  17. Luogu P2048 [NOI2010]超级钢琴
  18. 分享我对JS插件开发的一些感想和心得
  19. js获取n分钟(或n小时或n个月)后(或前)的时间(日期)
  20. 20155215 《Java程序设计》实验二( Java面向对象程序设计)实验报告

热门文章

  1. Android性能调优篇之探索垃圾回收机制
  2. JVM类加载的那些事
  3. Shell--数据流重定向
  4. js/jquery循环提取table单元格值
  5. scrapy-splash抓取动态数据例子十三
  6. IntelliJ IDEA 控制台中文乱码
  7. TestNG+ReportNG+Maven优化测试报告
  8. js标准化价钱
  9. ios 自动布局水平跟垂直居中
  10. linux-centos7中lnmp服务器编译安装含systemctl启动service(转)