题目大意:求三角形内不包含其他点的最大面积三角形
分析:枚举三个顶点,然后遍历其他点是否在这个三角形内,并且面积是否比之前的最大面积还大。题目中给出来了三点求面积的公式。判断点是否在三角形内有两种方法。
一、这个点与三角形任意两个顶点形成的共三个三角形的面积之和,等于当前三角形的面积,则说明在三角形内。
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
struct P {
int x, y;
}p[20];
int n;
double area(int a, int b, int c) {
return abs(0.5*((p[c].y-p[a].y)*(p[b].x-p[a].x)-(p[b].y-p[a].y)*(p[c].x-p[a].x)));
}
bool ok(int a, int b, int c, double s) {
for(int i = 0; i < n; i++)
if(i != a && i != b && i != c)
if(area(i, a, b)+area(i, b, c)+area(i, c, a) == s)
return false;
return true;
}
int main() {
while(scanf("%d", &n) && n != 0) {
char ch[2];
for(int i = 0; i < n; i++)
scanf("%s%d%d", ch, &p[i].x, &p[i].y);
double ans = 0;
int a, b, c;
for(int i = 0; i < n-2; i++)
for(int j = i+1; j < n-1; j++)
for(int k = j+1; k < n; k++) {
double s = area(i, j, k);
if(ok(i, j, k, s) && s > ans) {
ans = s;
a = i, b = j, c = k;
}
}
printf("%c%c%c\n", 'A'+a, 'A'+b, 'A'+c);
}
return 0;
}
二、以这个点为起点,三角形三个顶点为终点形成的三个向量A,B,C,A叉乘B,B叉乘C,C叉乘A同号的话,则说明在三角形内。
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
struct P {
int x, y;
P(){};
P(int x, int y):x(x), y(y) {}
}p[20];
int n;
P operator -(const P & p1, const P & p2) {
return P(p1.x-p2.x, p1.y-p2.y);
}
int operator ^(const P & p1, const P & p2) {
return p1.x*p2.y-p1.y*p2.x;
}
double area(int a, int b, int c) {
return abs(0.5*((p[c].y-p[a].y)*(p[b].x-p[a].x)-(p[b].y-p[a].y)*(p[c].x-p[a].x)));
}
bool ok(int a, int b, int c) {
for(int i = 0; i < n; i++) {
if(i != a && i != b && i != c) {
P v1 = p[a]-p[i], v2 = p[b]-p[i], v3 = p[c]-p[i];
//一定要有等号,等号表示这个点在某条边上
if(((v1^v2) >= 0 && (v2^v3) >= 0 && (v3^v1) >= 0) || ((v1^v2) <= 0 && (v2^v3) <= 0 && (v3^v1) <= 0)) {
return false;
}
}
}
return true;
}
int main() {
while(scanf("%d", &n) && n != 0) {
char ch[2];
for(int i = 0; i < n; i++)
scanf("%s%d%d", ch, &p[i].x, &p[i].y);
double ans = 0;
int a, b, c;
for(int i = 0; i < n-2; i++)
for(int j = i+1; j < n-1; j++)
for(int k = j+1; k < n; k++) {
double s = area(i, j, k);
if(ok(i, j, k) && s > ans) {
ans = s;
a = i, b = j, c = k;
}
}
printf("%c%c%c\n", 'A'+a, 'A'+b, 'A'+c);
}
return 0;
}