首页 > 其他 > 详细

HDU 4082 Hou Yi's secret-求相似三角形的最大个数-(坑货)

时间:2015-07-22 23:03:08      阅读:422      评论:0      收藏:0      [点我收藏+]

题意:找相似三角形的最大个数。注意不是所有相似三角形的个数,而是不同类相似三角形 中个数最大的

分析:

之前理解成了所有相似三角形的个数,所以尽管考虑了所有的特殊情况以及精度问题还是不停的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-求相似三角形的最大个数-(坑货)

原文:http://blog.csdn.net/ac_0_summer/article/details/47009163

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!