题目来源:[NWPU][2014][TRN][19]二维计算几何基础

http://vjudge.net/vjudge/contest/view.action?cid=54080#problem/C

作者:npufz

题目:

C - Segments

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Submit Status

Description

Given n segments in the two dimensional space, write a program, which determines if there exists a line such that after projecting these segments on it, all projected segments have at least one point in common.

Input

Input begins with a number T showing the number of test cases and then, T test cases follow. Each test case begins with a line containing a positive integer n ≤ 100 showing the number of segments. After that, n lines containing four real numbers x1y1x2y2 follow, in which (x1y1) and (x2y2) are the coordinates of the two endpoints for one of the segments.

Output

For each test case, your program must output "Yes!", if a line with desired property exists and must output "No!" otherwise. You must assume that two floating point numbers a and b are equal if |a - b| < 10-8.

Sample Input

3
2
1.0 2.0 3.0 4.0
4.0 5.0 6.0 7.0
3
0.0 0.0 0.0 1.0
0.0 1.0 0.0 2.0
1.0 1.0 2.0 1.0
3
0.0 0.0 0.0 1.0
0.0 2.0 0.0 3.0
1.0 1.0 2.0 1.0

Sample Output

Yes!
Yes!
No!

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
bool  intersection(const double  &x1,const double  &y1,const double  &x2,const double  &y2,const double  &x3,const double  &y3,const double  &x4,const double  &y4 )
{bool flag=false;double  m1,m2;flag=false;m1=(x3-x1)*(y2-y1)-(y3-y1)*(x2-x1);m2=(x4-x1)*(y2-y1)-(y4-y1)*(x2-x1);if((m1*m2)<1.0e-8)flag=true;return flag;
}
int main()
{int i,j,k,t,n;double  a[210][2];bool flag;scanf("%d",&t);while(t--){scanf("%d",&n);n*=2;for(i=0;i<n;i++)scanf("%lf%lf",&a[i][0],&a[i][1]);flag=false;for(i=0;i<n-1&&flag==false;i++)for(j=i+1;j<n&&flag==false;j++){if(fabs(a[i][0]-a[j][0])<1e-8&&fabs(a[i][1]-a[j][1])<1e-8) break;for(k=0;k<n;k+=2){if(intersection(a[i][0],a[i][1],a[j][0],a[j][1],a[k][0],a[k][1],a[k+1][0],a[k+1][1])==false)break;}if(k==n)  {flag=true;break;}}if(flag) printf("Yes!\n");else printf("No!\n");
}return 0;
}

反思:
这个题目其实等价于找到一条直线和所有的线段均有点,注意到如果这条直线存在,如果这条直线不经过所有线段中的两个,那么一定存在另一条经过两个端点的直线满足条件,这样就解决了问题,一开始通过所有的端点枚举直线时,没有考虑到枚举的两个端点可能是同一个点,就WA了,改正后就A了

Segments(计算几何基础)相关推荐

  1. 计算几何及其应用——计算几何基础

    写在前面:当时开计算几何这个专题神奇的从解析几何开始了,然后最近发现<计算几何及应用(金博)>这本书前面那章忽略掉了一些重要的东西比如说点定位.半平面相交之类的东西,恰好还有一些和计算几何 ...

  2. AcWing 2983. 玩具 / POJ 2318.toys(计算几何基础、二分、判断点和直线的位置关系)

    计算几何基础题 题目大意就是一个盒子被分成了若干个区域,有m个小球,问每个区域里分别有多少个小球. 我们首先考虑暴力. 我们如何判断小球是否在一个区域内呢,我们发现一个小球在区域x,也就是说所有小于x ...

  3. (一)计算几何基础(上)

    文章目录 无语子,自己的模板出锅了,不过修改好了 计算几何基础知识点 例题一: 例题二 例题三:![在这里插入图片描述](https://img-blog.csdnimg.cn/ed358fece28 ...

  4. 计算几何基础【用图来助你理解几何算法】

    写在前面,本人也是小白,这是我在大学自学的内容,有部分内容来自网上,若侵权请告知.当然如果这篇文章能够帮助到你,可以点赞收藏,如果写的不妥的地方,欢迎大佬们指出. 1.基本概念 1.1计算几何的引入 ...

  5. 计算几何基础入门详解

    计算几何基础 1.最开始要提一下的还是精度问题,这在计算几何中可以说非常关键!!! const double eps=1e-8; //我一般都用eps表示,控制在1e-8左右,当然有些题会有它的要求 ...

  6. 计算几何基础知识 叉乘、点乘、点到直线距离、叉积方向法等

    一.几何 常考却不怎么掌握的: ​ 数据结构:分块 ​ 字符串:后缀数组.后缀自动机 ​ 数学:FFT.DFT.NTT.杜教筛.拉格朗日插值等 ​ 图论:网络流.最小费用最大流 ​ 动规:五边形数优化 ...

  7. 二维计算几何基础题目泛做(SYX第一轮)

    题目1: POJ 2318 TOYS 题目大意: 给一个有n个挡板的盒子,从左到右空格编号为0...n.有好多玩具,问每个玩具在哪个空格里面. 算法讨论: 直接叉积判断就可以.注意在盒子的边界上面也算 ...

  8. 计算几何基础(持续更新)

    计算几何 文章目录 计算几何 二维几何基础 点和向量 点积和叉积 点和线 多边形 三角形和普通多边形定义 判断点在多边形内部 多边形的面积 求多边形的重心 圆 圆的定义 最小圆覆盖 二维几何基础 1. ...

  9. 二维计算几何基础知识

    1.点积: 向量点积的定义:(x1,y1)*(x2,y2)=x1*x2+y1*y2:满足交换律 向量点积的代数意义:向量V1的模 * 向量V2的模 * cos<V1,V2> 向量点积的几何 ...

最新文章

  1. 在 Eclipse 中使用 Maven 构建 Web 项目
  2. canvas在舞台上点击后图片旋转_View绘制系列(10)Canvas基础变换
  3. Python编码错误的解决办法SyntaxError: Non-ASCII character ‘\xe5‘ in file
  4. supervisord管理进程详解
  5. php数组合并字段,PHP数组按要求合并
  6. network/request.js网络请求模块封装
  7. 供应商否认iPhone 12延迟推出传闻 称生产按计划进行
  8. button3 电脑上mouse_专栏F|Cora单词168电脑(下):最强大脑,智慧的产物
  9. NW.js 简介与使用
  10. Unity3D 多平台_预编译相关宏定义
  11. Drools 文档(目录)
  12. 51nod 1218 最长递增子序列 V2(dp + 思维)
  13. 剑指offer 数字在排序数组中出现的次数
  14. vue程序中组件间的传值方式
  15. 【语音隐写】基于matlab GUI DWT音频数字水印【含Matlab源码 712期】
  16. 手动创建线程池_创建线程池
  17. 三、用python实现平稳时间序列的建模
  18. HealthKit开发教程之HealthKit的主要类型数据
  19. 零基础搭建完全免费个人静态博客
  20. Tangents UVA - 10674 (求两个圆公切线的切点)

热门文章

  1. Dos与DDOS介绍及实例
  2. java se学习笔记-基于尚硅谷谈斌老师教程
  3. 鱼和水的故事--完整版
  4. Adobe Master Collection 2021 crack
  5. 微信群发图文消息invalid media_id hint,thumb_media_id怎么获取
  6. 2016 MacBook删除系统之后系统恢复
  7. vue 学科年级学段多级联动需求 跨组件如何监听 如何解决vue-communicatio监听多个参数的问题 以及vue-communicatio的注意事项
  8. 商城之Fresco(FaceBook)
  9. javaee java_JavaEE:JavaEE技术组成
  10. 3D.GSM.CAR.CLOCK开源!!!!!!!EMWIN挑战3D效果,汽车仪表工程与大家一起交流学习。