代码改变世界

Points in rectangle

2019-07-27 20:31  木木王韦  阅读(91)  评论(0)    收藏  举报

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

这道题就是判断点到四条直线的距离,如果均等于或者小于各条边领边的边长,即在矩形内部或者边上,即存入

就是在找四条边的斜率的时候脑子又宕机了。。。把斜率搞反了。。。

ac代码

#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;

int n,a,m;

struct xy{
	int x,y;
	
};

xy e1[1005],e2[1005];

bool cmp(xy a,xy b){
	if(a.x ==b.x ) return a.y >b.y ;
	else return a.x >b.x ;
}

bool changdu1(int a1,int b1){
	int l;
	l=abs(a1+b1-a);
	//cout<<"111 "<<l<<" "<<abs((n-a)*2)<<endl;
	if(l<=abs(a-n)*2) return 1;
	else return 0;
}
bool changdu2(int a1,int b1){
	int l;
	
		l=abs(a1+b1-2*n+a);
		//cout<<"222 "<<l<<" "<<abs((n-a)*2)<<endl;
		if(l<=abs(a-n)*2) return 1;
	else return 0;
	
	
}
bool changdu3(int a1,int b1){
	int l;
	l=abs(a1-b1+a);
	//cout<<"333 "<<l<<" "<<abs(a*2)<<endl;
	if(l<=abs(a*2)) return 1;
	else return 0;
}
bool changdu4(int a1,int b1){
	int l;
	l=abs(a1-b1-a);
	//cout<<"444 "<<l<<" "<<abs(a*2)<<endl;
	if(l<=abs(a*2)) return 1;
	else return 0;
}
int main(){
	cin>>n>>a;
	cin>>m;
	for(int i=0;i<m;i++){
		cin>>e1[i].x>>e1[i].y ; 
	}
	//sort(e1,e1+m,cmp);
	int sum=0;
	int x1,y1,x2,y2;
	x1=min(0,n-a);
		x2=max(a,n);
		
	for(int i=0;i<m;i++){
		if(e1[i].x >=x1&&e1[i].x <=x2&&e1[i].y >=x1&&e1[i].y <=x2){
			//cout<<e1[i].x <<"  "<<e1[i].y <<endl;
		//	cout<<changdu1(e1[i].x,e1[i].y)<<endl;
			//cout<<changdu2(e1[i].x,e1[i].y)<<endl;
			//cout<<changdu3(e1[i].x,e1[i].y)<<endl;
			//cout<<changdu4(e1[i].x,e1[i].y)<<endl;
			if(changdu1(e1[i].x,e1[i].y)&&changdu2(e1[i].x,e1[i].y)&&changdu3(e1[i].x,e1[i].y)&&changdu4(e1[i].x,e1[i].y)){
				e2[sum].x=e1[i].x ;
				e2[sum].y=e1[i].y ;
				sum++; 
			}
		}
		
		
		
	}
	sort(e2,e2+sum,cmp);
		
		if(sum==0) cout<<"-1"<<endl;
		else{
		cout<<sum<<endl;
			for(int i=0;i<sum;i++){
			cout<<e2[i].x <<" "<<e2[i].y <<endl;
		}
		}
		
	return 0;
}