您的位置:首页 > 其它

ZOJ-1041

2014-01-01 20:07 351 查看
主要是几何知识,先排除那些圆外的点,对于圆内的点,遍历每个点,和圆心连成直线,然后判断其他点在直线上或直线下或者被直线经过,统计直线上下点最多的情况

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

struct point
{
int x;
int y;
};

typedef struct point *ptr;

int squareD(int x1, int y1, int x2, int y2)
{
return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
}

int horl(int ox, int oy, int px, int py, int x, int y)
{
return (py - oy) * x + (px * oy - ox * py) - y * (px - ox);
}

int main()
{
int ox, oy;
double r;
while (scanf("%d %d %lf", &ox, &oy, &r), r >= 0)
{
int n, x, y, total = 0;
ptr array;
scanf("%d", &n);
array = (ptr) malloc(n * sizeof(struct point));
while (n--)
{
scanf("%d %d", &x, &y);
if (squareD(ox, oy, x, y) > r * r)
continue;
(array + total)->x = x;
(array + total)->y = y;
total++;
}

int i, j, r, high, low, result = 0, max;
for (i = 0; i < total; i++)
{
high = 0, low = 0;
for (j = 0; j < total; j++)
{
r = horl(ox, oy, (array + i)->x, (array + i)->y, (array + j)->x,
(array + j)->y);
if (r >= 0)
high++;
if (r <= 0)
low++;
}
max = high > low ? high : low;

if (max > result)
result = max;
}
printf("%d\n", result);
free(array);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: