您的位置:首页 > 其它

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

#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 ;
}


更多问题请关注个人博客,不定时更新
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: