1. 程式人生 > >n個點求 能構成多少個三角形

n個點求 能構成多少個三角形

思路:1、先求出n個結點中取出三個結點 有多少種方法 C(n,3)的組合;
	2、在找出三個點不能組成三角形的情況;有斜率相等和不存在斜率兩種情況;
	完整程式碼如下:
	#include<iostream>
#include <vector>
#include <assert.h>
using namespace std;
struct   node//點的座標;
{
	int x;
	int y;

};
int get_the_number(node *a, int n);
//=========main函式
int main()
{
	int n;
	cin >> n;
	node *a = new node[n];
	//node *a=(node *)malloc(sizeof(node)*n);
	for (int i = 0; i < n; i++)
		cin >> a[i].x >> a[i].y;

	for(int i=0;i<n;i++)
		cout<<a[i].x<<" "<<a[i].y<<endl;
	
	int result = get_the_number(a, n);
	cout << result << endl;
}
int get_the_number(node *a, int n)
{
	if (n <= 2)//不能滿足組成三角形的情況;
		return 0;
	
	int number1 = n*(n - 1)*(n - 2) / 6;//從n個點中取三個點有多少種取法;

	int counts = 0;//求出不能組成三角形的情況;1、斜率相等;2、斜率不存在
	for (int i = 0; i < n;i++)
	for (int j = i + 1; j < n;j++)
	for (int k = j + 1; k < n; k++)
	{
		if ((a[k].y - a[j].y) / (a[k].x - a[j].x) == (a[j].y - a[i].y) / (a[j].x - a[i].x))
			counts++;
		if (a[k].x == a[j].x == a[i].x)
			counts++;
	}
	return number1 - counts;//兩者之差就是三角形的個數;

}