题意:
后羿射了一些箭形成一些坑,这些坑可以组成三角形,求相似三角形最大的数量。
什么是相似三角形最大数量?
相似三角形可能形成很多个,我们把不同样子的三角形定义为不同类的三角形,那么在同一类的三角形中,数量最大的就是答案。
注意:数据中的点可能用重复,要去重。
#include <bits/stdc++.h>
using namespace std;
double eps=1e-6;
bool is[205][205];
struct Triangle{
double a,b,c;
bool v;
}t[1000];
struct Point
{
double x;
double y;
}a[20];
double dis(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool line(Point a,Point b,Point c)
{
if(fabs((b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y))<eps)return true;
else return false;
}
void add(Point a,Point b,Point c,int J)///按照顺序添加三角形的三边
{
//cout<<J<<" "<<a.x<<" "<<a.y<<" "<<b.x<<" "<<b.y<<" "<<c.x<<" "<<c.y<<" ";
double d1=dis(a,b);
double d2=dis(a,c);
double d3=dis(b,c);
double sum=d1+d2+d3;
t[J].a=min(d1,min(d2,d3));
t[J].c=max(d1,max(d2,d3));
t[J].b=sum-t[J].a-t[J].c;
//cout<<t[J].a<<" "<<t[J].b<<" "<<t[J].c<<endl;
t[J].v=false;
}
bool judge(Triangle x,Triangle y)///判断两个三角形是否相似,用乘法
{
if((fabs(y.a*x.b-x.a*y.b)<eps)&&(fabs(y.b*x.c-x.b*y.c)<eps)&&(fabs(y.a*x.c-x.a*y.c)<eps))
return true;
else return false;
}
int main()
{
ios::sync_with_stdio(false);///加个速
int n;
int x,y;
while(cin>>n&&n)
{ memset(is,false,sizeof(is));
int Y=0;
for(int i=0;i<n;i++)
{
cin>>x>>y;
x+=100;y+=100;
if(!is[x][y]){is[x][y]=true;a[Y].x=x,a[Y].y=y;Y++;}///记忆化,防止数据是重复的点
}
int J=0;
for(int i=0;i<Y;i++)
for(int j=i+1;j<Y;j++)
for(int k=j+1;k<Y;k++)
{
if(!line(a[i],a[j],a[k]))///三点不共线构成三角形
{
add(a[i],a[j],a[k],J);
J++;
}
}
int ans=0;
for(int i=0;i<J;i++)
{ if(t[i].v)continue;
int temp=1;
t[i].v=true;
for(int j=i+1;j<J;j++)
{
if(t[j].v)continue;
if(judge(t[i],t[j])){/*cout<<"i="<<i<<" j="<<j<<endl;*/temp++;t[j].v=true;}///相似的一类三角形全标记
}
ans=max(ans,temp);//cout<<endl;
}
cout<<ans<<endl;
}
return 0;
}