8531. KD's fear
【问题描述】
这天晚上,KD召集了组员们开会。
wjj
HansBug
MountVoom
HugeGun
Ryan
Hefafa
wjy
prime21
八个人坐成了一个凸多边形,KD突然发现自己被围在了多边形内,他感到了恐惧。于是他使用了秘技:反复横跳,位移到了另一个位置。但是他现在并不知道自己是否还在多边形内,只能求助于你。
【输入形式】
共 9 行。
第一行两个整数 x0 , y0 表示 KD 反复横跳之后的坐标。
接下来每行开头为一个组员的 ID ,紧接着两个整数 xi , yi 表示该组员的坐标。
【输出形式】
若 KD 在八个组员围成的多边形内(在多边形的边上也算),则输出“WTF!”(不包括引号)。否则输出“yeah!”(不包括引号)。
【样例输入】
0 0
wjj 2 2
HansBug 4 0
MountVoom 3 -2
HugeGun 1 -3
Ryan -2 -2
Hefafa -4 0
wjy -3 2
prime21 -1 3
【样例输出】
WTF!
【样例说明】
如图,KD 在反复横跳之后,仍然在凸多边形内,因为恐惧,喊出“WTF!”。
【数据范围和提示】
-1000≤xi,yi≤1000。
保证输入为凸多边形。
保证按多边形逆时针的顺序输入点的坐标。
方法很多,请大家发挥想象。
【出题人】
HugeGun
题解:老实说,刚开始看了一眼通过率以为很简单,但实际上根本不会,网上找的算法,可能是我太菜了没怎么看懂,用的射线法求点在多边形的位置,链接在这儿了自己看吧,下面是AC代码:
#include"iostream"
#include"vector"
using namespace std;
typedef struct str
{
int x,y;
}p;
vector<p> poly;
bool pass(p o)
{
int px=o.x;
int py=o.y;
bool flag = false;
int i,l,j;
for(i=0,l=poly.size(),j=l-1;i<l;j=i,i++)
{
int sx=poly[i].x;
int sy=poly[i].y;
int tx=poly[j].x;
int ty=poly[j].y;
if((sx==px && sy==py) || (tx==px && ty==py))
return true;
if((sy<py && ty>=py) || (sy>=py && ty<py))
{
int x=sx+(py-sy)*(tx-sx)/(ty-sy);
if(x == px)
return true;
if(x > px)
flag = !flag;
}
}
return flag ?true:false;
}
int main()
{
p o;
cin >> o.x >> o.y;
for(int i=0;i<8;i++)
{
string l;
cin >> l;
p k;
cin >> k.x >> k.y;
poly.push_back(k);
}
if(pass(o))
cout << "WTF!" << endl;
else
cout << "yeah!" << endl;
return 0;
}
觉得有用就点个赞吧,右上角哦,谢谢。