Hdoj 1756 Cupid's Arrow
2018-01-08 17:04
120 查看
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
Author
linle
Source
2007省赛集训队练习赛(6)_linle专场
题目分析
判断点是否在多边形内,网上查阅了一下用的是射线法,具体看代码注释
Code
更多问题请关注个人博客,不定时更新
传说世上有一支丘比特的箭,凡是被这支箭射到的人,就会深深的爱上射箭的人。
世上无数人都曾经梦想得到这支箭。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
Author
linle
Source
2007省赛集训队练习赛(6)_linle专场
题目分析
判断点是否在多边形内,网上查阅了一下用的是射线法,具体看代码注释
Code
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cctype> #include<cstring> #include<cstdlib> using namespace std; typedef __int64 ll; const int MAXN=110; const double EPS=1e-8; struct node { double x,y; }p[MAXN]; int n; double crossMult(double x,double y,double x1,double y1) { return (x*y1-y*x1); }//叉乘 bool isOnALine(node a, node b, node c) { if( fabs(crossMult(a.x-c.x,a.y-c.y,b.x-c.x,b.y-c.y))<EPS && min(b.x,c.x)<=a.x && a.x<=max(b.x,c.x) && min(b.y,c.y)<=a.y && a.y<=max(b.y,c.y) ) return true; return false; }//判定是否在一条直线上 bool isin(node a,node b,node c) { if(b.y!=c.y && min(b.y,c.y)<a.y && a.y<=max(b.y,c.y)) return true; return false; }//判断点是否在两点所夹的纵坐标之间,注意这边只能选择纵坐标高一点的,随手画一个凹多边形即可知道若正好穿过较低点会影响点的计数 bool contain(node a) { int crossNum = 0; p = p[0]; node d; d.x=-200; d.y=a.y; //引一个点做直线ad for(int i=0;i<n;i++) { node b = p[i]; node c = p[i+1]; if(isOnALine(a,b,c)) return true; //判断点是否在多边形边(线段)上 if(isin(a,b,c)) if(( crossMult(c.x-b.x,c.y-b.y,a.x-b.x,a.y-b.y) * crossMult(c.x-b.x,c.y-b.y,d.x-b.x,d.y-b.y))<EPS) crossNum++; } return (crossNum % 2 ==0 ? false : true); } int main() { while(cin>>n) { for(int i=0;i<n;i++) { cin >> p[i].x >> p[i].y; } int cnt; cin>>cnt; while(cnt--) { node tmp; cin >> tmp.x >> tmp.y; if( contain(tmp) ) cout << "Yes" << endl; else cout << "No" << endl; } } return 0 ; }
更多问题请关注个人博客,不定时更新
相关文章推荐
- HDOJ 1756 Cupid's Arrow
- HDU 1756 Cupid's Arrow(判断点是否在多边形内部)
- hdu 1756 Cupid's Arrow(点在多边形内)
- 【HDOJ】1756 Cupid's Arrow
- hdu 1756 Cupid's Arrow 计算几何
- HDU 1756 Cupid's Arrow(判断点是否在任意多边形上且包括边)
- hdu 1756 Cupid's Arrow 计算几何
- HDU 1756 Cupid's Arrow 计算几何
- HDU 1756 Cupid's Arrow(判定点在多边形内)
- HDU 1756 Cupid's Arrow(点是否在多边形内)
- HDU1756:Cupid's Arrow
- HDU 1756 Cupid's Arrow 判断点在多边形的内部
- hdu 1756 Cupid's Arrow(计算几何)
- HDU 1756 点在多边形内 Cupid's Arrow
- hdu 1756:Cupid's Arrow(计算几何,判断点在多边形内)
- HDOJ 1756 Cupid's Arrow
- HDU 1756 Cupid's Arrow (几何问题,判定点在多边形内部)
- hud1756 Cupid's Arrow 计算几何
- hdu 1756 Cubid's Arrow(判断点在多边形内)
- ACM-计算几何之Cupid's Arrow——hdu1756