给你n个点的坐标,让你判定能组成多少个三角形。
这是今天一位同门面试遇到的一道简单题,看到她用三边关系来做,感觉做的非常复杂,于是我简单实现了一下。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using std::cin; using std::cout; using std::endl;
using std::string;
int n, result;
typedef struct SNode
{
int x;
int y;
}N;
N* cinData();
int getNum(N* a, int n);
int main()
{
N* a = cinData();
result = getNum(a, n);
cout << result << endl;
system("pause");
return 0;
}
N* cinData()
{
cin >> n;
N* a = new N[n];
for (int ii = 0; ii < n; ii++)
cin >> a[ii].x >> a[ii].y;
return a;
}
int getNum(N* a, int n)
{
if (n <= 2)
return 0;
//C(n,3),n个点中选3个点
int n1 = n * (n - 1) * (n - 2) / 6;
int n2 = 0;
for (int ii =0; ii < n; ii++)
for (int jj = ii + 1; jj < n; jj++)
for (int kk = jj + 1; kk < n; kk++)
{
//斜率相等,共线不能组成三角形
if ((a[kk].y - a[jj].y) / (a[kk].x - a[jj].x) == (a[jj].y - a[ii].y) / (a[jj].x - a[ii].x))
n2++;
//斜率都不存在,垂直方向共线也不能组成三角形
if (a[kk].x == a[jj].x == a[ii].x)
n2++;
}
result = n1 - n2;
return result;
}