题意:找相似三角形的最大个数。注意不是所有相似三角形的个数,而是不同类相似三角形 中个数最大的
分析:
之前理解成了所有相似三角形的个数,所以尽管考虑了所有的特殊情况以及精度问题还是不停的wawawa,甚至重新写了一遍不用余弦来判断而是用边。绝望之中仔细看别人的代码,原来题意理解错了。
这题的收获:
1.三角形相似的判定:用余弦定理、或者边成比例。最好用边,然后判定的时候不用比值,用乘积,这样就不存在精度问题。
2.耐心、对自己有信心。
代码:
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #define INF 1000000007 #define max(a,b) a>b?a:b using namespace std; const double eps=1e-9; int n; struct node1{ double x,y; }a[20]; node1 aa[20]; struct node2{ double a1,a2,a3; }m[1500]; int vis2[1500]; int vis3[20]; int main() { while(cin>>n){ if(!n) break; memset(vis2,0,sizeof(vis2)); memset(vis3,0,sizeof(vis3)); memset(a,0,sizeof(a)); int tot=0,cnt=0; int mx=0; for(int i=0;i<n;i++) cin>>aa[i].x>>aa[i].y; int len=n; n=0; for(int i=0;i<len;i++){ if(!vis3[i]){ a[n].x=aa[i].x; a[n++].y=aa[i].y; int j; for(j=i+1;j<len;j++) if(aa[i].x==aa[j].x&&aa[i].y==aa[j].y) vis3[j]=1; } } for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ for(int k=j+1;k<n;k++){ double p=(a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y); double q=(a[i].x-a[k].x)*(a[i].x-a[k].x)+(a[i].y-a[k].y)*(a[i].y-a[k].y); double u=(a[j].x-a[k].x)*(a[j].x-a[k].x)+(a[j].y-a[k].y)*(a[j].y-a[k].y); double tmp1=(p+q-u)/(2*sqrt(p)*sqrt(q)); double tmp2=(p+u-q)/(2*sqrt(p)*sqrt(u)); double tmp3=(q+u-p)/(2*sqrt(u)*sqrt(q)); if(tmp1>tmp2){ double tmp=tmp1; tmp1=tmp2; tmp2=tmp; } if(tmp1>tmp3){ double tmp=tmp1; tmp1=tmp3; tmp3=tmp; } if(tmp2>tmp3){ double tmp=tmp2; tmp2=tmp3; tmp3=tmp; } double ll=abs(tmp1+1); if(ll>=eps){ m[cnt].a1=tmp1; m[cnt].a2=tmp2; m[cnt++].a3=tmp3; } } } } if(cnt<=1) cout<<cnt<<endl; else{ for(int i=0;i<cnt;i++){ int ans=0; for(int j=i+1;j<cnt;j++){ if(abs(m[i].a1-m[j].a1)<eps&&abs(m[i].a2-m[j].a2)<eps&&abs(m[i].a3-m[j].a3)<eps){ ans++; } } mx=max(mx,ans); } cout<<mx+1<<endl; } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 4082 Hou Yi's secret-求相似三角形的最大个数-(坑货)
时间: 2024-12-28 14:37:03