2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > HDU4082Hou Yi's secret(相似三角形的个数)

HDU4082Hou Yi's secret(相似三角形的个数)

时间:2020-04-23 00:28:08

相关推荐

HDU4082Hou Yi's secret(相似三角形的个数)

题目链接:

http://acm./showproblem.php?pid=4082

题意:

给定n个点判断这些点能组成的三角形中,与同一个三角形相似的三角形的最大个数。

分析:

就是暴力枚举。但是写的时候要注意以下几点。

1)必须得能组成三角形。

2)去掉重复的点。。。被坑了,orz

代码如下:

#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>using namespace std;const double eps = 1e-8;const int maxn = 20;struct point{double x,y;}p[maxn];struct triangle{double a[3];}t[maxn*maxn*maxn];int cross(point p0,point p1,point p2){return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}double dis(point p1,point p2){return sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));}bool similar(triangle t1,triangle t2){if( (fabs(t1.a[0]*t2.a[1]-t1.a[1]*t2.a[0])<eps)&&(fabs(t1.a[1]*t2.a[2]-t1.a[2]*t2.a[1])<eps)&&(fabs(t1.a[0]*t2.a[2]-t1.a[2]*t2.a[0])<eps))return true;return false;}int main(){int n;while(~scanf("%d",&n)&&n){for(int i=0;i<n;i++){scanf("%lf%lf",&p[i].x,&p[i].y);for(int j=0;j<i;j++){if(p[i].x==p[j].x&&p[i].y==p[j].y){i--;n--;break;}}}int cnt = 0;if(n<3){puts("0");continue;}for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){for(int k=j+1;k<n;k++){if(cross(p[i],p[j],p[k])){t[cnt].a[0]=dis(p[i],p[j]);t[cnt].a[1]=dis(p[i],p[k]);t[cnt].a[2]=dis(p[j],p[k]);sort(t[cnt].a,t[cnt].a+3);cnt++;}}}}int ans = 0;for(int i=0;i<cnt;i++){int tmp = 1;for(int j=i+1;j<cnt;j++)if(similar(t[i],t[j]))tmp++;ans=max(ans,tmp);}printf("%d\n",ans);}return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。