(poj step8.1.1.1)POJ 1106 Transmitters(判断一条边在另一条边的哪一个方向——计算叉积)

/*
 * POJ_1106.cpp
 *
 *  Created on: 2013年11月16日
 *      Author: Administrator
 */

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

const double epsi = 1e-10;
const double pi = acos(-1.0);
const int maxn = 50005;

struct Point{
	double x,y;
	Point(double _x = 0,double _y = 0):x(_x),y(_y){

	}

	Point operator-(const Point& op2)const{//**要注意这种写法
		return Point(x - op2.x,y - op2.y);
	}

	double operator^(const Point& op2)const{
		return x*op2.y - y*op2.x;
	}
};

int sign(const double& x){//判断x是正数还是负数
	if(x > epsi){
		return 1;//传入的数是一个整数...
	}else if(x < -epsi){
		return -1;//传入的数是一个负数...
	}

	return 0;
}

double sqr(double x){//计算一个数的平方数
	return x*x;
}

double mul(const Point& p0,const Point& p1,const Point& p2){//计算p0p1与p1p2的叉积叉积
	return (p1-p0)^(p2-p0);
}

double dis2(const Point& p0,const Point& p1){//返回两个点的距离的平方
	return sqr(p0.x - p1.x) + sqr(p0.y - p1.y);
}

double dis(const Point& p0,const Point& p1){//返回两个点的距离
	return sqrt(dis2(p0,p1));
}

int n;
Point p[maxn],cp;
double r;

int main(){
	while(scanf("%lf%lf%lf",&cp.x,&cp.y,&r),r >= 0){
		scanf("%d",&n);

			int i;
			for(i = 0 ; i < n ; ++i){
				scanf("%lf%lf",&p[i].x,&p[i].y);
			}

			int j;
			int ans = 0;
			for(i = 0 ; i < n ; ++i){
				int temp = 0 ;
				for(j = 0 ; j < n ; ++j){
					if(sign(dis(p[j],cp) - r) != 1){//如果在辐射范围内
						if(sign(mul(cp,p[i],p[j])) != 1){//如果在辐射的一边,这里等于-1也是行的
							temp++;
						}
					}
				}

				ans = max(ans,temp);
			}

			printf("%d\n",ans);
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值