UVa 10112 - Myacm Triangles

本文介绍了一个用于在平面上找到四个到十五个点组成的面积最大的三角形的算法。通过直接枚举所有可能的三角形组合,并利用特定的面积计算方法,该算法能够高效地筛选出符合条件的最大三角形。同时,文中详细阐述了如何判断点是否位于三角形内部,采用的方法包括判断点在边的同侧和利用白书中提供的面积计算公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:给你平面上的4-15个点,让你找到面积最大的三角形,三角形中不能有其他点。

分析:计算几何。因为数据较小直接枚举所有情况,找到符合题意最大的即可。

            判断点在三角形内的犯法很多,我之前一直用,判断点在边的同侧的方法(向量)。

            这里利用白书中方法,判断O在△ABC中的方法:S△ABC = S△ABO + S△AOC + S△OBC

            这里的面积是大小,不是向量,取绝对值计算。

说明:注意库( ⊙ o ⊙ )啊!白CE了一次。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>

using namespace std;

typedef struct pnode
{
	char name;
	int  x,y;
}point;
point P[20];

int Area( point a, point b, point c )
{
	return abs((b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y));
}

int main()
{
	int n;
	while ( cin >> n && n ) {
		for ( int i = 0 ; i < n ; ++ i )
			cin >> P[i].name >> P[i].x >> P[i].y;
		
		int Max = 0,a = 0,b = 1,c = 2;
		for ( int i =  0  ; i < n ; ++ i )
		for ( int j = i+1 ; j < n ; ++ j )
		for ( int k = j+1 ; k < n ; ++ k ) {
			int flag = 1;
			int temp,area = Area( P[i], P[j], P[k] );
			for ( int p = 0 ; p < n ; ++ p ) {
				if ( p == i || p == j || p == k )
					continue;
				temp  = Area( P[p], P[j], P[k] );
				temp += Area( P[i], P[p], P[k] );
				temp += Area( P[i], P[j], P[p] );
				if ( temp == area ) {
					flag = 0;
					break;
				}
			}
			if ( flag && Max < area ) {
				a = i; b = j; c = k;
				Max = area;
			}
		}
		
		printf("%c%c%c\n",P[a].name,P[b].name,P[c].name);	
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值