标签:hdu
题意:找相似三角形的最大个数。注意不是所有相似三角形的个数,而是不同类相似三角形 中个数最大的
分析:
之前理解成了所有相似三角形的个数,所以尽管考虑了所有的特殊情况以及精度问题还是不停的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-求相似三角形的最大个数-(坑货)
标签:hdu
原文地址:http://blog.csdn.net/ac_0_summer/article/details/47009163