Cupid's Arrow

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1756

Problem Description

传说世上有一支丘比特的箭,凡是被这支箭射到的人,就会深深的爱上射箭的人。
世上无数人都曾经梦想得到这支箭。Lele当然也不例外。不过他想,在得到这支箭前,他总得先学会射箭。
日子一天天地过,Lele的箭术也越来越强,渐渐得,他不再满足于去射那圆形的靶子,他开始设计各种各样多边形的靶子。
不过,这样又出现了新的问题,由于长时间地练习射箭,Lele的视力已经高度近视,他现在甚至无法判断他的箭射到了靶子没有。所以他现在只能求助于聪明的Acmers,你能帮帮他嘛?

Input
本题目包含多组测试,请处理到文件结束。
在每组测试的第一行,包含一个正整数N(2<N<100),表示靶子的顶点数。
接着N行按顺时针方向给出这N个顶点的x和y坐标(0<x,y<1000)。
然后有一个正整数M,表示Lele射的箭的数目。
接下来M行分别给出Lele射的这些箭的X,Y坐标(0<X,Y<1000)。

Output
对于每枝箭,如果Lele射中了靶子,就在一行里面输出"Yes",否则输出"No"。

Sample Input
4
10 10
20 10
20 5
10 5
2
15 8
25 8

Sample Output
Yes

No

这道题也是判断点是否在多边形内,这次来说一下射线法。。

之前说了一个O(logn)的二分法,详情可戳:http://blog.csdn.net/lttree/article/details/24291719

射线法:

这张图片比较全啊。

我们以所求点为原点向任意方向做一条射线,如果点在多边形内,做的射线肯定会与多边形的某条边相交。(如a所示),因为多边形可能为凹多边形,所以如果交点有一个则为点在多边形内,若有2个交点则点在多边形外。

以此类推,奇数个点代表点在多边形内,偶数个点代表点在多边形外。

但是还是有几个特殊情况要处理一下:

①射线经过的是多边形端点,如图b

②射线经过多边形某条边,如图c

③射线经过多边形端点和边,如图d

④射线经过端点且边,如图e

我们的解决方法:(序号顺序并非解决相应问题方法)

①对于多边形平行边,不考虑它。

②对于多边形的顶点和射线相交的情况,如果该顶点是其所属边上纵坐标较大的顶点,则计数,否则,忽略该点。

③对于所求的点在多边形边上的情况,直接判断点属于多边形。

And now 让我们一起AC~

PS:不要忘了精度问题哈~

#include <stdio.h>
#define MAX 100001
// 需要精度判断
#define EPS 1e-8
struct point
{double x,y;
}p[MAX];
// 比较大小函数
double Max(double a,double b)    { return a>b?a:b; }
double Min(double a,double b)    { return a>b?b:a; }
double abs(double a)    {   return a<0?-a:a; }
// 两个向量的叉积
double cross(double x,double y,double xx,double yy)
{return x*yy-y*xx;
}
// 判断点是否在直线上,叉积为0,且满足坐标相对位置条件
bool online(point a,point b,point c)
{if( abs( cross(a.x-b.x,a.y-b.y,c.x-b.x,c.y-b.y) )<EPS &&a.x>=Min(b.x,c.x) && a.x<=Max(b.x,c.x) &&a.y>=Min(b.y,c.y) && a.y<=Max(b.y,c.y) )return 1;return 0;
}int main()
{int i,n,m,js,flag;point a,b,c,d;while( scanf("%d",&n)!=EOF ){// 先输入多边形各个点(此题按顺时针输入for(i=0;i<n;++i)scanf("%lf%lf",&p[i].x,&p[i].y);scanf("%d",&m);while(m--){flag=js=0;// 输入所求点坐标scanf("%lf%lf",&a.x,&a.y);b.x=-100,b.y=a.y;for(i=0; i<n; ++i){c.x=p[i].x;c.y=p[i].y;d.x=p[ (i+1)%n ].x;d.y=p[ (i+1)%n ].y;// 判断点是否在线上if(online(a,c,d)){flag=1;break;}// 第一个判断:是否平行边,后面两个a点纵坐标在两端点之间,而且<=最大的端点(因为解决方法中②)// 第二个判断为判断线段相交,注意精度判定if( c.y!=d.y && a.y>Min(c.y,d.y) && a.y<=Max(c.y,d.y) )if( cross(a.x-d.x,a.y-d.y,c.x-d.x,c.y-d.y)*cross(b.x-d.x,b.y-d.y,c.x-d.x,c.y-d.y)<EPS )++js;}// 判断交点奇偶if(js&1)    flag=1;if(flag)    printf("Yes\n");else    printf("No\n");}}return 0;
}

ACM-计算几何之Cupid's Arrow——hdu1756相关推荐

  1. ACM计算几何题目推荐

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

  2. 计算几何问题 java_【转载】ACM计算几何题目推荐

    2107    Quoit Design    典型最近点对问题 POJ    3714    Raid    变种最近点对问题 B,最小包围圆 最小包围圆的算法是一种增量算法,期望是O(n). ZO ...

  3. acm 计算几何题目集合

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

  4. ACM计算几何专项练习题目总结

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

  5. 【转载】ACM计算几何题目推荐

    计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模板 ...

  6. 一见钟情,“钟”的并不是脸,而是……

    一见钟情是我们很多人也许都体验过的情感经历,也是很多人爱情的起点.有人心向往之,司马光的"青烟翠雾罩轻盈,飞絮游丝无定",细腻的描写了这种情感体验.也有人不屑一顾,说一见钟情只是一 ...

  7. ACM模块解析之 数论

    数  论 一.简介 数论是ACM中的重点内容.历年竞赛题目,一般都有1~2道题目与数论有密切关系.数论涉及的概念和算法很多,用途也非常广泛.掌握与数论有关的方法,是参赛者需要具备的必要技能.数论的学习 ...

  8. 二维几何基础大合集!《计算几何全家桶(一)》(基础运算、点、线、多边形、圆、网格)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的模板整合计划 目录 1.基本运算 1.1 判断正负函数(sgn) 1.2 点积(数量积.内积)(Dot) 1.3 向量积 ...

  9. 杭电OJ分类题目(3)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(3) HDU Computational Ge ...

最新文章

  1. 使用await / async时,HttpClient.GetAsync(...)永远不会返回
  2. quicklook不能预览office_万物皆可格!给空格键施加神奇魔法的神器软件—快速预览工具QuicklookPC软件...
  3. html中的框架frameset和frame及iframe
  4. 无意间看到Pure-Mvc记录下
  5. CSS3特效之转化(transform)和过渡(transition)
  6. [label][JavaScript]七个JavaScript技巧
  7. C#学习基础--静态类和静态类成员
  8. centos 6.8安装git_Centos(6/7)安装GitLab超详细教程
  9. CentOS下gitlab迁移和升级
  10. AppStore上传已经开发好的App的方法
  11. 利用随机数种子来使pytorch中的结果可以复现
  12. windows2003视频教程
  13. 测试用例设计方法(二)
  14. themeforest 模板
  15. 1 is not JSON serializable的解决方案
  16. 工欲善其事之Redis可视化管理工具
  17. 消费者人群画像—信用智能评分 比赛回顾
  18. archlinux 安装matlab
  19. 画春天的景色计算机教案,【美丽的春天图画】美丽的春天幼儿园春季教案
  20. 利用C#编写象棋棋盘

热门文章

  1. 涉密系统集成具体解答
  2. 如何成功打jar 包以及运行
  3. pro6 surface 进入安全_Surface pro 6到手后,别着急,先做好“两个安检”
  4. 【局部图像描述子】Harris角点检测器
  5. js调用vlc_vlc播放器或者web实现rtmp拉流
  6. FTP集合(ZT, 不知是真是假)
  7. ORAN专题系列-22:O-RU全球前20的主要供应商调研报告
  8. (六)光学显微镜实验报告
  9. python 投屏_scrcpy 手机投屏
  10. 网站SEO伪原创四步走,轻松搞定文章伪原创