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. python绘制笑脸-用python绘图
  2. php 升序 排序字符串,PHP asort():对数组排序(升序),并保持索引关系
  3. Windows Server 2012 DHCP 服务器中的新功能:故障转移和策略
  4. js深度复制一个对象使用JSON.stringify是最好的办法吗
  5. NILMTK——因子隐马尔可夫之隐马尔可夫
  6. 【转】热门3D游戏视觉效果名词简介
  7. Javascript七种继承方式
  8. 【代码源 Div1 - 108】#464. 数数(主席树,区间比k小的数的个数)HDU4417
  9. App设计之路——WebApp浅谈
  10. 2014年FME校园培训考核通过名单
  11. chm提示 已取消到该网页的导航的解决方法
  12. MP地面站二次开发教程(二)MP的框架与修改
  13. ppt模板目录页如何排版设计?
  14. Regionals 2014 Asia - Daejeon
  15. keras非线性回归代码专题
  16. markdown写出项目目录结构
  17. linux制作deepin启动盘制作工具,深度启动盘制作工具(Deepin Boot Maker)
  18. 纯千兆电口和自适应电口的区别
  19. 字节跳动或推独立出口电商APP,亚马逊阿里虾皮:不慌
  20. [MySQL] 零基础学MySQL 04

热门文章

  1. 我的世界java版可以加mod吗_《我的世界》中国版局域网添加MOD图文教程 MOD添加方法...
  2. linux作业究极简化版
  3. 国宝拜年 新生大熊猫“天团”送出最萌猪年祝福
  4. linux美化windows,Ubuntu Skin Pack:把Windows 7美化成Ubuntu界面
  5. vscode关闭源代码管理处的提示
  6. 2023 女神节网站api接口源码
  7. 使用python-Django创建Web站点
  8. 程序员的一生:程序员的自我管理
  9. 国民技术MCU之串口烧录
  10. CheatSheet:Python快速参考