11年北京现场赛 水题
判断相似三角形个数
注意重点 共线
然后无脑爆搜。。。
#include "stdio.h"
#include "string.h"
#include "math.h"
#include "stdlib.h"
#include "iostream"
#include "algorithm"
using namespace std;
struct comp1
{
int x, y;
} point[21];
struct comp2
{
double x[10];
} tri[1010];
double dis(int a,int b)
{
return sqrt( (point[a].x-point[b].x)*(point[a].x-point[b].x)+(point[a].y-point[b].y)*(point[a].y-point[b].y) );
}
int collinear(int a,int b,int c)
{
double x1,y1,x2,y2;
x1=point[b].x-point[a].x;
y1=point[b].y-point[a].y;
x2=point[c].x-point[a].x;
y2=point[c].y-point[a].y;
if (fabs(x1*y2-x2*y1)<1e-10) return 1;
else return 0;
}
int judge(int a,int b)
{
double x,y,z;
x=tri[a].x[0]/tri[b].x[0];
y=tri[a].x[1]/tri[b].x[1];
z=tri[a].x[2]/tri[b].x[2];
if ( fabs(x-y)>1e-10) return 0;
if ( fabs(x-z)>1e-10) return 0;
if ( fabs(y-z)>1e-10) return 0;
return 1;
}
int main()
{
int n,sum,x,y,flag,i,j,k,max;
while (scanf("%d",&n)!=EOF)
{
if (n==0) break;
sum=0;
for (i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
flag=1;
for (j=1;j<=sum;j++)
if (point[j].x==x && point[j].y==y) { flag=0; break;}
if (flag==1)
{
sum++;
point[sum].x=x;
point[sum].y=y;
}
}
n=sum;
sum=0;
for (i=1;i<=n;i++)
for (j=i+1;j<=n;j++)
for (k=j+1;k<=n;k++)
{
if (collinear(i,j,k)==1) continue;
sum++;
tri[sum].x[0]=dis(i,j);
tri[sum].x[1]=dis(i,k);
tri[sum].x[2]=dis(j,k);
sort(tri[sum].x,tri[sum].x+3);
}
max=0;
n=sum;
for (i=1;i<=n;i++)
{
sum=0;
for (j=1;j<=n;j++)
if (judge(i,j)==1) sum++;
if (sum>max) max=sum;
}
printf("%d\n",max);
}
return 0;
}