/* Sat Jul 3 16:22:06 JST 2004 */ /* Sat Jul 3 17:13:19 JST 2004 */ #include #include typedef struct { double x, y; } point_t; double EuclidDiff(point_t p1, point_t p2) { return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); } int main() { int i, j, k, x, y, count, maxcount; point_t p[512], center, center2; int N; double base, oset, diff; while (1) { scanf("%d", &N); if (N == 0) { break; } for (i = 0; i < N; i++) { scanf("%lf %lf", &p[i].x, &p[i].y); } maxcount = count = 1; for (i = 0; i < N; i++) { for (j = i+1; j < N; j++) { base = atan2(p[j].y - p[i].y, p[j].x - p[i].x); if (2.0 < (diff = EuclidDiff(p[i], p[j]))) { continue; } oset = acos(diff / 2); center.x = p[i].x + cos(base - oset); center.y = p[i].y + sin(base - oset); count = 0; for (k = 0; k < N; k++) { if (EuclidDiff(center, p[k]) <= 1 + 0.000000001) { count++; } } if (maxcount < count) { maxcount = count; } center.x = p[i].x + cos(base + oset); center.y = p[i].y + sin(base + oset); count = 0; for (k = 0; k < N; k++) { if (EuclidDiff(center, p[k]) <= 1 + 0.00000001) { count++; } } if (maxcount < count) { maxcount = count; } } } printf("%d\n", maxcount); } return 0; }