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

题目


题意:

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

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

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


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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值