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>