UVA - 10112 Myacm Triangles
一定要细心!被一个括号坑了好久QAQ
题目大意:给出几个点的坐标,任意三个点可围成一个三角形。求其中面积最大,且不包含其他点(边界上也没有)的三角形。
解题思路:穷举,用循环控制点。判断一个点是否在三角形内用面积判断,即该点与三角形任意两点所成的三角形的面积和,是否会等于原三角形的面积,是则该点在三角形内。刚好使用题目给的公式。之后每遇见一个符合条件且面积大于 MAX 的三角形,就保存相关数据。
#include<iostream>
#include<cstdio>
#include<math.h>
#include<algorithm>
using namespace std;
double areax(int ax, int ay, int bx, int by, int cx, int cy) {
return fabs(0.5*((cy - ay)*(bx -ax) - (by - ay)*(cx - ax)));
}
int main () {
int n , i ,j ,k , l,p[20][2];
double area , a1, a2,a3;
char alp[20] , p3[3];
bool flag;
while( cin >> n ,n ) {
for( i = 0; i < n ;i++ ){
cin >> alp[i];
cin >> p[i][0] >> p[i][1];
}
double max = 0;
for( i = 0; i < n-2 ; i++ ) {
for( j = i+1 ; j < n-1 ; j++) {
for( k = j+1 ; k < n ; k++ ) {
flag = 1;
for( l = 0 ; l < n ; l ++ ) {
if( i != l && j !=l && k != l ) {
area = areax( p[i][0],p[i][1],p[j][0],p[j][1],p[k][0],p[k][1]);
a1 = areax( p[i][0],p[i][1],p[j][0],p[j][1],p[l][0],p[l][1]);
a2 = areax( p[i][0],p[i][1],p[l][0],p[l][1],p[k][0],p[k][1]);
a3 = areax( p[l][0],p[l][1],p[j][0],p[j][1],p[k][0],p[k][1]);
if( a1 + a2 + a3 == area ) { flag = 0; break;}
}
}
if(flag) {
if( area > max ) {
max = area;
p3[0] = alp[i]; p3[1] = alp[j]; p3[2] = alp[k];
}
}
}
}
}
sort(p3, p3+3 );
cout << p3[0] <<p3[1] <<p3[2] << endl;
}
return 0;
}