题目大意:求三角形内不包含其他点的最大面积三角形
分析:枚举三个顶点,然后遍历其他点是否在这个三角形内,并且面积是否比之前的最大面积还大。题目中给出来了三点求面积的公式。判断点是否在三角形内有两种方法。
一、这个点与三角形任意两个顶点形成的共三个三角形的面积之和,等于当前三角形的面积,则说明在三角形内。
代码:
#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; }