10112 - Myacm Triangles

题目:10112 - Myacm Triangles


题目大意:求给定的点中围成的三角形面积最大且不包括其它点在区间的三个点。


解题思路:求三角形的面积:公式:S = 0.5 × |(y3 - y1)(x2 - x1- (y2 - y1)(x3 - x1)|.

判断一个点是否在以围成的三角形内,看这个点与三条边形成的三角形的面积之和是否等于原来三角形的面积。是就在三家形内


#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>

const int N = 20;
int s[N][2], n;

bool judge(int a, int b, int c, double area) {
	
	double sum;
	for(int i = 0; i < n; i++) {

		sum = 0;
		if(i != a && i != b && i != c) {
			
			sum += 0.5 * labs((s[a][1] - s[i][1]) * (s[b][0] - s[i][0]) - (s[b][1] - s[i][1]) * (s[a][0] - s[i][0]));
			sum += 0.5 * labs((s[a][1] - s[i][1]) * (s[c][0] - s[i][0]) - (s[c][1] - s[i][1]) * (s[a][0] - s[i][0]));
			sum += 0.5 * labs((s[b][1] - s[i][1]) * (s[c][0] - s[i][0]) - (s[c][1] - s[i][1]) * (s[b][0] - s[i][0]));
			if (fabs(area - sum) < pow(10, -9))
				return false;

		}
	}
	return true;
}

int main() {

	while(scanf("%d%*c", &n) && n) {
		
		int i, j, k;
		char ch;
		int x, y, z;
		memset(s, 0, sizeof(int));
		for(i = 0; i < n; i++)
			scanf("%c%d%d%*c", &ch, &s[i][0], &s[i][1]);
		double sum, max = 0;
		for(i = 0; i < n; i++)
			for(j = i + 1; j < n; j++)
				for(k = j + 1; k < n; k++) {
					
					sum = 0.5 * labs((s[k][1] - s[i][1]) * (s[j][0] - s[i][0]) - (s[j][1] - s[i][1]) * (s[k][0] - s[i][0]));

					if(sum > max && judge(i, j, k, sum)) {

						max = sum;
						x = i, y = j, z = k;
					}
				}
				
			printf("%c%c%c\n", x + 'A', y + 'A', z + 'A');
	}
	return 0;
}


你可能感兴趣的:(10112 - Myacm Triangles)