题目大意:给出圆心坐标和半径,并给出几个点,求出半圆放在哪个角度是包含的给出的点最多。
解题思路:叉积算法,设矢量P=(x1,y1),Q=(x2,y2),若P*Q>0,则P在Q的顺时针方向,
若P*Q<0,则P在Q逆时针方向。先判断点是否在圆内,再用叉积。
若P*Q=0,则P和Q共线
代码:
#include<stdio.h>
#include<math.h>
const double inf=1e-6;
double x[160],y[160];
double dis(int xa,int ya,int xb,int yb)
{
return sqrt(double((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb))); //判断点是否在圆内
}
int side(int i,int j,int xx,int yy)
{
if( (xx - x[i]) * (yy - y[j]) - (xx - x[j]) * (yy - y[i]) >= 0)//叉积判断
return 1;
else
return 0;
}
int main()
{
double r;
int ox,oy,xx,yy,n,i;
while(scanf("%d%d%lf",&ox,&oy,&r)!=EOF && r>0)
{
scanf("%d",&n);
int j=0;
for( i=0;i<n;i++)
{
scanf("%d%d",&xx,&yy);
if(r-dis(xx,yy,ox,oy)>-inf)//判断点是否在圆内
{
x[j]=xx;
y[j]=yy;
++j;
}
}
n=j;
int maxx=0;
for( i=0;i<n;i++) //判断在哪个角度,包含的点最多
{
int k=0;
for(int j=0;j<n;j++)
if(side(i,j,ox,oy))
++k;
if(maxx<k)maxx=k;
}
printf("%d\n",maxx);
}
return 0;
}
探讨了无线网络中如何通过调整屏蔽型半圆发射器的方向来最大化覆盖特定网格上的数据点数量。利用几何方法和叉积算法确定最佳发射角度。
1万+

被折叠的 条评论
为什么被折叠?



