有n个不同的点,问有多少组三元组能构成面积非0的三角形。
Input
单组测试数据。 第一行一个整数n (1 ≤ n ≤ 2000),表示点的数目。 接下来n行,每行包含两个整数 xi, yi ( -100 ≤ xi, yi ≤ 100),表示第i个点的坐标。输入保证点是两两不同的。
Output
输出合法的三角形数目。
Input示例
4 0 0 1 1 2 0 2 2
Output示例
3
#include <iostream>
#include <cstring>
#include <map>
#include <algorithm>
#include <limits.h>
using namespace std;
typedef long long ll;
const int MAXN = 2005;
int x[MAXN], y[MAXN];
ll n;
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> x[i] >> y[i];
}
int result = ((n-2) * (n-1) * n) / 6;
int rep = 0;
for (int i = 0; i < n; i++)
{
map<long double, int> buf;
for (int j = i + 1; j < n; j++)
{
long double rate = INT_MAX;
long double yDiff = y[j] - y[i];
long double xDiff = x[j] - x[i];
if (xDiff != 0)
{
rate = yDiff / xDiff;
}
buf[rate]++;
}
for (map<long double, int>::iterator it = buf.begin(); it != buf.end(); it++)
{
if (it->second > 1)
{
rep += ((it->second - 1) * (it->second)) / 2;
}
}
}
result -= rep;
cout << result << endl;
return 0;
}