HDU 4082 Hou Yi's secret(相似三角形最大数量)

来源:互联网 发布:智能电视软件 编辑:程序博客网 时间:2024/06/03 19:25

题目


题意:

后羿射了一些箭形成一些坑,这些坑可以组成三角形,求相似三角形最大的数量。

什么是相似三角形最大数量?

相似三角形可能形成很多个,我们把不同样子的三角形定义为不同类的三角形,那么在同一类的三角形中,数量最大的就是答案。


注意:数据中的点可能用重复,要去重。

#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;}


原创粉丝点击