Points in rectangle
单点时限: 2.0 sec
内存限制: 512 MB
在二维平面中有一个矩形,它的四个坐标点分别为(0,a),(a,0),(n,n−a),(n−a,n)。你现在有m个点,现在你想知道有多少个点是在这个矩形内的(边上的也算)。
输入格式
第一行输入n,a(1≤a<n≤103)。
第二行一个正整数m(1≤m≤103),代表你拥有的点的个数,接下来m行,每行一个点的坐标xi,yi(1≤xi,yi≤103)。
输出格式
第一行输出在矩形内的点的个数,然后输出在矩形内点的坐标,横坐标大的优先,如果横坐标相同,则纵坐标大的优先。如果没有,输出−1。
样例
input
6 1
5
1 2
1 3
2 3
3 4
4 5
output
4
4 5
3 4
2 3
1 2
首先我们有4个坐标(0,a),(a,0),(n,n−a),(n−a,n),那么很显然我们可以画出图,求出这4条直线
方程,然后把点带进去,求出的y与实际点的y比较,得知该点在线的哪个范围
4次比较后,观察是否在矩形内,是就加入结构体。判断完所有点后,统一排序
代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int a,b;
}s[1200];
bool cmp(node x,node y)
{
if(x.a==y.a)
return x.b>y.b;
return x.a>y.a;
}
int k1,k2,k3,k4;
int b1,b2,b3,b4;
int check(int a,int b)
{
double y1=k1*a+b1; double y2=k2*a+b2;
double y3=k3*a+b3; double y4=k4*a+b4;
if(b>=y1&&b<=y2&&b>=y3&&b<=y4)
return 1;
return 0;
}
int main()
{
int n,a,b,m,k=0;
scanf("%d%d%d",&n,&a,&m);
k1=k2=-1;b1=a;b2=2*n-a;
k3=k4=1;b3=-a;b4=a;
while(m--)
{
scanf("%d%d",&a,&b);
if(check(a,b))
{
s[k].a=a;
s[k].b=b;
k++;
}
}
sort(s,s+k,cmp);
if(k==0) printf("-1\n");
else{
printf("%d\n",k);
for(int i=0;i<k;i++)
printf("%d %d\n",s[i].a,s[i].b);
}
return 0;
}