题目:点击打开链接
题意:给你n个点,问你组成的相似三角形的个数最多是多少
分析:直接暴力,很坑的是,这里面有重复的点,还要考虑能否组成三角形
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct point
{
ll x,y;
} p[20];
struct sanjiao
{
ll a,b,c;
} s[1000];
ll dis(point a,point b)
{
return ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
int n;
while(scanf("%d",&n)!=-1)
{
if(n==0)
break;
for(int i=0; i<n; i++)
{
scanf("%lld%lld",&p[i].x,&p[i].y);
}
// cout<<dis(p[0],p[1])<<endl;
point ss;
int tmpp[20];
memset(tmpp,0,sizeof(tmpp));
for(int i=0; i<n; i++)
{
ss.x=p[i].x;
ss.y=p[i].y;
for(int j=i+1; j<n; j++)
{
if((p[j].x==ss.x)&&(p[j].y==ss.y))
tmpp[j]=1;
}
}
int su=0;
int ans[1000];
memset(ans,0,sizeof(ans));
ll tmp[3];
for(int i=0; i<n; i++)
{
if(tmpp[i]==1)
continue;
for(int j=i+1; j<n; j++)
{
if(tmpp[j]==1)
continue;
for(int k=j+1; k<n; k++)
{
if(tmpp[k]==1)
continue;
// cout<<i<<j<<k<<endl;
tmp[0]=dis(p[i],p[j]);
tmp[1]=dis(p[i],p[k]);
tmp[2]=dis(p[j],p[k]);
//cout<<tmp[0]<<" "<<tmp[1]<<" "<<tmp[2]<<endl;
sort(tmp,tmp+3);
if((4*tmp[0]*tmp[1])>((tmp[2]-tmp[1]-tmp[0])*(tmp[2]-tmp[1]-tmp[0])))
{
if(su==0)
{
s[su].a=tmp[0];
s[su].b=tmp[1];
s[su].c=tmp[2];
ans[su]=1;
su++;
}
else
{
int hang=0;
for(int t=0; t<su; t++)
{
if((s[t].a*tmp[1]==s[t].b*tmp[0])&&(s[t].b*tmp[2]==s[t].c*tmp[1]))
{
//cout<<"+++"<<endl;
ans[t]++;
hang=1;
break;
}
}
if(hang==0)
{
s[su].a=tmp[0];
s[su].b=tmp[1];
s[su].c=tmp[2];
ans[su]++;
su++;
}
}
}
}
}
}
int maxn=ans[0];
for(int i=1; i<su; i++)
maxn=max(ans[i],maxn);
printf("%d\n",maxn);
}
return 0;
}