Advertisement

Points in rectangle

阅读量:

Points in rectangle

单点时限: 2.0 sec

内存限制: 512 MB

在二维平面内存在一个矩形,在其四个顶点分别标有坐标(0,a)、(a,0)、(n,n−a)以及(n−a,n)。目前你拥有m个点,请问其中有多少个点位于这个矩形内部(包括边界)?

请指定n和a的值(其中a必须小于n且都不超过103)。接着给出一个正整数m(范围在1到103之间),它表示所给点的数量。随后是m组数据(共m行),每组数据包含两个整数x_i和y_i(它们都在1到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;
    }

全部评论 (0)

还没有任何评论哟~