HLG 1306 再遇攻击[判断点在多边形内]

Description
Dota中英雄技能攻击会有一个范围,现在释放一个技能给出他的攻击范围和目标英雄的位置,问是否能攻击到。攻击范围保证是一个多边型。
Input

有多组测试数据

第一行输入1个整数n, 期中n代表攻击范围是给出的n个点组成的多边形,按照时针方向(顺或逆)依次给出,(n>=3)N = 0输入结束。

第二行a,b表示目标英雄的坐标( 0 < a,b<100)

接下来有n行,每行两个整数xy0 < x,y <100)表示每个点的坐标

攻击范围在边缘也算在内

Output

每组结果输出占一行

如果能够攻击到输出”Yes”

否则输出”No”

Sample Input

3

1 1

4 4

5 4

4 6
0

Sample Output
No
#include<stdio.h>
#include<string.h>
int max(int a,int b)
{
if(a>b)return a;
return b;
}
int min(int a,int b)
{
if(a<b)return a;
return b;
}
struct point
{
int x,y;
}q[100];
int mult(int x,int y,int x1,int y1)
{
return x*y1-y*x1;
}
int online(point a,point b,point c)
{
if(mult(a.x-b.x,a.y-b.y,c.x-b.x,c.y-b.y)==0&&
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,t,count,flag;
point a,b,c,d;
// scanf("%d",&t);
while(scanf("%d",&n),n)
{
flag=count=0;
scanf("%d%d",&a.x,&a.y);
b.x=-100; b.y=a.y;
for(i=0;i<n;i++)
scanf("%d%d",&q[i].x,&q[i].y);
for(i=0;i<n;i++)
{
c.x=q[i].x; c.y=q[i].y;
d.x=q[(i+1)%n].x; d.y=q[(i+1)%n].y;
if(online(a,c,d))
{flag=1; break;}
if(c.y!=d.y&&a.y>min(c.y,d.y)&&a.y<=max(c.y,d.y))
{
if(mult(a.x-d.x,a.y-d.y,c.x-d.x,c.y-d.y)*mult(b.x-d.x,b.y-d.y,c.x-d.x,c.y-d.y)<0)
count++;
}
}
if(count&1)flag=1;
if(flag)printf("Yes\n");
else printf("No\n");
}
return 0;
}

posted @ 2012-03-14 13:05  'wind  阅读(179)  评论(0编辑  收藏  举报