Jlh打靶

Description:

Jlh喜欢射箭,尤其喜欢射正方形的靶子。在二维坐标里有一个长方形区域表示靶子,有n个点表示jlh射出去的箭,求有多少支箭在靶子上(边缘也算靶子上)。

Input:

输入一个T(T<=20)表示有T组数据。第一行输入一个n(n<=100),表示有n支箭,接下来n行输入x,y(|x,y|<100)表示箭的坐标。最后一行输入输入4个坐标(逆时针给出),表示长方形区域。(顺时针给出)

Output:

输出有多少支箭在靶子上

Sample Input:
2
5
1 1
0 1
2 0
0 2
2 3
0 0 2 0 2 2 0 2
10
2 2
0 4
0 3
1 1
4 3
2 3
2 0
3 1
0 0
4 4
1 0 4 3 3 4 0 1
Sample Output:
4
4
我用的是求出f1,f2,f3,f4,若f1(x,y)*f3(x,y)<=0&&f2(x,y)*f4(x,y)<=0那么这个点就在这个矩形内

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define N 110
double x[N],y[N],mx[4],my[4];
double f1(double x0,double y0)
{
	double a,b,c;
	if(my[0]==my[1])
	{
		a=0.0;c=-1.0*my[1];b=1.0;
	}
	else if(mx[0]==mx[1])
	{
		b=0.0;c=-1.0*mx[1];a=1.0;
	}
	else
	{
		a=1.0*(my[1]-my[0]);
		b=-1.0*(mx[1]-mx[0]);
		c=(mx[1]-mx[0])*my[0]-mx[0]*(my[1]-my[0]);
	}
	if(a<0)
	{
		a=-a,b=-b,c=-c;
	}
	return (a*x0+b*y0+c);
}
double f2(double x0,double y0)
{
	double a,b,c;
	if(my[1]==my[2])
	{
		a=0.0;c=-1.0*my[1];b=1.0;
	}
	else if(mx[1]==mx[2])
	{
		b=0.0;c=-1.0*mx[1];a=1.0;
	}
	else
	{
		a=1.0*(my[2]-my[1]);
		b=1.0*(mx[1]-mx[2]);
		c=(mx[2]-mx[1])*my[1]-mx[1]*(my[2]-my[1]);
	}
	if(a<0)
	{
		a=-a,b=-b,c=-c;
	}
	return (a*x0+b*y0+c);
}
double f3(double x0,double y0)
{
	double a,b,c;
	if(my[2]==my[3])
	{
		a=0.0;c=-1.0*my[2];b=1.0;
	}
	else if(mx[2]==mx[3])
	{
		b=0;c=-mx[2];a=1;
	}
	else
	{
		a=1.0*(my[3]-my[2]);
		b=-1.0*(mx[3]-mx[2]);
		c=(mx[3]-mx[2])*my[2]-mx[2]*(my[3]-my[2]);;
	}
	if(a<0)
	{
		a=-a,b=-b,c=-c;
	}
	return (a*x0+b*y0+c);
}
double f4(double x0,double y0)
{
	double a,b,c;
	if(my[0]==my[3])
	{
		a=0;c=-my[3];b=1.0;
	}
	else if(mx[0]==mx[3])
	{
		b=0;c=-mx[3];a=1.0;
	}
	else
	{
		a=1.0*(my[0]-my[3]);
		b=-1.0*(mx[0]-mx[3]);
		c=(mx[0]-mx[3])*my[3]-mx[3]*(my[0]-my[3]);
	}
	if(a<0)
	{
		a=-a,b=-b,c=-c;
	}
	return (a*x0+b*y0+c);
}
int pending(int n)
{
	double q,w,e,r;
	int sum=0;
	int i;
	for(i=0;i<n;i++)
	{
		q=f1(x[i],y[i]);
		w=f2(x[i],y[i]);
		e=f3(x[i],y[i]);
		r=f4(x[i],y[i]);
		if(q*e<=0&&w*r<=0)
			sum++;
	}
	return sum;
}
int main()
{
	int t,n,i,j,ans;
	scanf("%d",&t);
		while(t--)
		{
			scanf("%d",&n);
			for(i=0;i<n;i++)
			{
				scanf("%lf%lf",&x[i],&y[i]);
			}
			for(i=0;i<4;i++)
			{
				scanf("%lf%lf",&mx[i],&my[i]);
			}
			ans=pending(n);
			printf("%d",ans);
			if(t>0)
				printf("\n");
		}
	return 0;
}</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值