重庆赛区ACM热身赛 8531. KD's fear

博客描述了KD在一次组员围成的凸多边形内使用秘技位移后,如何判断自己是否仍在多边形内的问题。采用射线法算法,通过编程实现判断点在多边形的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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's-fear.png

如图,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;
}

觉得有用就点个赞吧,右上角哦,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值