事实证明,这题卡精度!!!有几个trick,但是仔细读题后应该不算trick的。
重点需要筛掉,三点共线不算三角形,其他基本没了。剩下的就是卡精度了吧?
比赛的时候,我计算的是他们的cos值,比较的是这个,刚才重写了一遍,WA掉了。我没加精度。加上后就过了。比赛的时候因为谨慎加精度了。。。
也可以直接比较长度比例的,一样的。这个做法不伤精度。
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <string>
#include <algorithm>
#define MID(x,y) ( ( x + y ) >> 1 )
#define L(x) ( x << 1 )
#define R(x) ( x << 1 | 1 )
#define FOR(i,s,t) for(int i=(s); i<(t); i++)
#define BUG puts("here!!!")
#define STOP system("pause")
#define file_r(x) freopen(x, "r", stdin)
#define file_w(x) freopen(x, "w", stdout)
using namespace std;
const int MAX = 20;
struct point{
int x, y;
void get()
{
scanf("%d%d", &x, &y);
}
};
struct triangle{
double l[4];
};
triangle t[MAX*MAX*MAX];
point p[MAX];
const double eps = 1e-8;
bool dy(double x,double y) { return x > y + eps;} // x > y
bool xy(double x,double y) { return x < y - eps;} // x < y
bool dyd(double x,double y) { return x > y - eps;} // x >= y
bool xyd(double x,double y) { return x < y + eps;} // x <= y
bool dd(double x,double y) { return fabs( x - y ) < eps;} // x == y
double disp2p(point a, point b)
{
return sqrt((a.x - b.x)*(a.x - b.x)*1.0 + (a.y - b.y)*(a.y - b.y));
}
bool cmp_ang(triangle a, triangle b)
{
FOR(i, 0, 3)
if( !dd(a.l[i], b.l[i]) )
return xy(a.l[i], b.l[i]);
}
bool cmp(point a, point b)
{
if( a.x == b.x )
return a.y < b.y;
return a.x < b.x;
}
bool cmp_equal(point a, point b)
{
return dd(a.x, b.x) && dd(a.y, b.y);
}
double angle(double a, double b, double c)
{
return (b*b + c*c - a*a)/(2*b*c);
}
bool check(double *l)
{
FOR(i, 0, 3)
if( l[i] == 1 || l[i] == -1 )
return false;
return true;
}
bool similar(double *a, double *b)
{
FOR(i, 0, 3)
if( !dd(a[i], b[i]) )
return false;
return true;
}
int solve( int n )
{
sort(p, p+n, cmp);
n = unique(p, p+n, cmp_equal) - p;
int cnt = 0;
FOR(i, 0, n)
FOR(k, i+1, n)
FOR(j, k+1, n)
{
double a = disp2p(p[i], p[k]);
double b = disp2p(p[k], p[j]);
double c = disp2p(p[i], p[j]);
t[cnt].l[0] = angle(a, b, c);
t[cnt].l[1] = angle(b, a, c);
t[cnt].l[2] = angle(c, b, a);
sort(t[cnt].l, t[cnt].l+3);
if( !check(t[cnt].l) )
continue;
cnt++;
}
if( cnt == 0 ) return 0;
sort(t, t+cnt, cmp_ang);
int mmax = 1, ans = 1;
FOR(i, 1, cnt)
if( similar(t[i].l, t[i-1].l) )
ans++;
else
{
mmax = max(mmax, ans);
ans = 1;
}
mmax = max(mmax, ans);
return mmax;
}
int main()
{
int n;
while( ~scanf("%d", &n) && n )
{
FOR(i, 0, n)
p[i].get();
int ans = solve( n );
printf("%d\n", ans);
}
return 0;
}