Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
Farmer John 想要给他的奶牛们建造一个三角形牧场。
有 N 个栅栏柱子分别位于农场的二维平面上不同的点 (X1,Y1)…(XN,YN)。
他可以选择其中三个点组成三角形牧场,只要三角形有一条边与 x 轴平行,且有另一条边与 y 轴平行。
Farmer John 可以围成的牧场的最大面积是多少?
保证存在至少一个合法的三角形牧场。
输入格式
输入的第一行包含整数 N。
以下 N 行每行包含两个整数 Xi 和 Yi,均在范围 −104…104 之内,描述一个栅栏柱子的位置。
输出格式
由于面积不一定为整数,输出栅栏柱子可以围成的合法三角形的最大面积的两倍。
数据范围
3≤N≤100
输入样例:
4
0 0
0 1
1 0
1 2
输出样例:
2
样例解释
位于点 (0,0)、(1,0) 和 (1,2) 的木桩组成了一个面积为 1 的三角形。所以,答案为 2⋅1=2。
只有一个其他的三角形,面积为 0.5。
思路
根据题意可以发现这是一道排列+模拟的题目,我们可以使用暴力枚举的方法进行解题。首先题目是需要找到一个直角三角形,于是我们可以选中一个点,然后找出跟他同一行的点、同一列的点,这样就可以组成直角三角形。这里使用三层循环遍历三角形上的每一个点。
注意:最后求体积时,因为答案需要乘以2,所以公式不用再除二;每一条边长可能为负数,使用abs函数使其一定为正数。
代码
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int ,int> PII;
const int N = 110;
PII a[N];
int main()
{
int n;
cin >> n;
for(int i = 0;i < n;i ++) cin >> a[i].first >> a[i].second;
int res = 0;
for(int i = 0;i < n;i ++)
{
for(int j = 0;j < n;j ++)
{
for(int k = 0;k < n;k ++)
{
if(i != j && i != k && j != k){
if(a[j].first == a[i].first && a[j].second == a[k].second)
res = max(res,abs(a[j].first - a[k].first) * abs(a[j].second - a[i].second));
}
}
}
}
cout << res << endl;
return 0;
}