当前位置: 代码迷 >> 综合 >> UVA-10112 - Myacm Triangles
  详细解决方案

UVA-10112 - Myacm Triangles

热度:64   发布时间:2023-12-19 11:39:25.0

这道题目差点把我整死了,调试了得仨小时才整出来。。。。

题意很简单:给你一些点,让你从中选取三个点,让这三个点构成的面积最大,并且这三个点围成的三角形里面不能有别的点。

做法也很简单:枚举所有可能的情况。对于每种情况,判断这种情况下的面积有多大,是不是当前最大面积,如果是,就判断里面有没有点,有就舍弃。

最后得出的结果就是了、

#include<stdio.h>
#include<math.h>
struct list
{int x,y;
}map[20];
double s_get(struct list a, struct list b,struct list c)
{return fabs(0.5*((c.y-a.y)*(b.x-a.x)-(b.y-a.y)*(c.x-a.x)));
}//得出三个点构成的三角形的面积
int cha(struct list a,struct list b,struct list c,struct list d)
{return s_get(a,b,c) == s_get(a,b,d)+s_get(a,c,d)+s_get(b,c,d);
}//判断点是不是在三角形的内部。
int main()
{int n;char c[100];int x,y,z;while(scanf("%d%*c",&n)&&n){double m=-1.0;int i,j,k;for(i=0;i<n;i++){scanf("%c%d%d%*c",&c[i],&map[i].x,&map[i].y);}for(i=0;i<n;i++)//一次枚举{for(j=i+1;j<n;j++){for(k=j+1;k<n;k++){int flag=1,p;for(p=0;p<n;p++){if(p==k||p==i||p==j)continue;if(cha(map[i],map[j],map[k],map[p])){flag=0;break;}}if(flag&&m<s_get(map[i],map[j],map[k])){m=s_get(map[i],map[j],map[k]);x=i;y=j;z=k;}}}}printf("%c%c%c\n",65+x,65+y,65+z);}return 0;
}