#include <stdio.h>
#include <algorithm>
using namespace std;
struct point{
char name;
int x;
int y;
}p[20];
struct tri{
point pp[3];
double s;
}triang[10000];
int cmp(tri a, tri b){
return a.s > b.s;
}
int main(){
int num;
while (scanf("%d", &num) && num != 0){
getchar();
int n = num;
while (n--){
scanf("%c%d%d", &p[n].name, &p[n].x, &p[n].y);
getchar();
}
int count = 0;
for (int i = 0; i < num - 2; i++)
for (int j = i + 1; j < num - 1; j++)
for (int k = j + 1; k < num; k++){
triang[count].pp[0] = p[i];
triang[count].pp[1] = p[j];
triang[count].pp[2] = p[k];
triang[count].s = fabs(0.5 * ((p[k].y - p[i].y) * (p[j].x - p[i].x) - (p[j].y - p[i].y) * (p[k].x - p[i].x)));
count++;
}
sort(triang, triang + count, cmp);
bool f = false;
for (int m = 0; m < count; m++){
for (int i = 0; i < num; i++){
if (p[i].name != triang[m].pp[0].name && p[i].name != triang[m].pp[1].name && p[i].name != triang[m].pp[2].name){
double s1, s2, s3;
s1 = fabs(0.5 * ((triang[m].pp[0].y - p[i].y) * (triang[m].pp[1].x - p[i].x) - (triang[m].pp[1].y - p[i].y) * (triang[m].pp[0].x - p[i].x)));
s2 = fabs(0.5 * ((triang[m].pp[0].y - p[i].y) * (triang[m].pp[2].x - p[i].x) - (triang[m].pp[2].y - p[i].y) * (triang[m].pp[0].x - p[i].x)));
s3 = fabs(0.5 * ((triang[m].pp[2].y - p[i].y) * (triang[m].pp[1].x - p[i].x) - (triang[m].pp[1].y - p[i].y) * (triang[m].pp[2].x - p[i].x)));
if ((s1 + s2 + s3) <= triang[m].s)
break;
}
if (i == num - 1){
f = true;
printf("%c%c%c\n", triang[m].pp[2].name, triang[m].pp[1].name, triang[m].pp[0].name);
}
}
if (f)
break;
}
}
return 0;
}
Myacm Triangles
大意:
给出最多15组的坐标,在这些坐标中找到一个三角形,该三角形满足面积最大,且三角形之中不包含其他的点,点在边上也不行;
要点:
找到3个一组的三角形,对其按面积排序,找到一个除了本身的三点其余点均在外部的三角形;
判断时可由面积法进行判断,找到一个点,使其与三角形的任意两点组成三个三角形,若s1+s2+s3=s则改点在三角形之内;
代码: