注意重点&三点共线的情况。还有蛋疼的精度!
#define N 20
#define eps 1e-8
struct node {
int x,y;
}p[N];
struct edge {
double l[3];
};
edge tri[3*N*N];
bool dd(double x,double y) { return fabs( x - y ) < eps;}
double dis(node a, node b) {
return sqrt((a.x - b.x) * (a.x - b.x)*1.0 + (a.y - b.y) * (a.y - b.y)*1.0);
}
bool chk(node a, node b, node c) {
if ((b.y - a.y) * (c.x - a.x) == (c.y - a.y) * (b.x - a.x))return true;
return false;
}
bool cmp1(node a, node b) {
if (a.x == b.x)return a.y < b.y;
return a.x < b.x;
}
bool cmp2(node a, node b) {
return (a.x == b.x) && (a.y == b.y);
}
bool similar(double *a, double *b) {
if(dd(a[0]/b[0], a[1]/b[1]) && dd(a[1]/b[1], a[2]/b[2]))return true;
return false;
}
int gao(int n) {
int i,j,k;
sort(p,p+n,cmp1);
n = unique(p,p+n,cmp2) - p;
int cnt = 0;
bool tag = 0;
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
for (k = j + 1; k < n; k++) {
if (chk(p[i], p[j], p[k]))continue;
tag = 1;
tri[cnt].l[0] = dis(p[i], p[j]);
tri[cnt].l[1] = dis(p[i], p[k]);
tri[cnt].l[2] = dis(p[j], p[k]);
sort(tri[cnt].l, tri[cnt].l + 3);
cnt++;
}
}
}
if(!tag)return 0;
int maxm = 1;
for (i = 0; i < cnt; i++) {
int num = 1;
for (j = 0; j < cnt; j++) {
if(i == j)continue;
if( similar(tri[i].l, tri[j].l) )num++;
}
maxm = max (maxm, num);
}
return maxm;
}
int main() {
int n;
while( scanf("%d",&n) && n) {
int i;
for (i = 0; i < n; i++) scanf("%d%d",&p[i].x, &p[i].y);
int ans = gao(n);
printf("%d\n",ans);
}
return 0;
}