# Combinatorics# Geometry# Brute Force

b275 - 数三角形

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算給定平面上 n 個點所能構成的三角形數量。三角形必須是非退化的,即三點不能共線。

解題思路

此題採用暴力解法。對於任意三個點,檢查它們是否共線。如果三個點不共線,則構成一個三角形,計數器加一。由於題目保證任意兩個點不重合,因此只需要檢查三個點是否共線即可。共線的判斷方式是利用斜率。如果三個點 (x1, y1), (x2, y2), (x3, y3) 共線,則 (y2 - y1) / (x2 - x1) = (y3 - y1) / (x3 - x1)。為了避免除以零的錯誤,可以改寫為 (y2 - y1) * (x3 - x1) = (y3 - y1) * (x2 - x1)。

複雜度分析

  • 時間複雜度: O(n^3)
  • 空間複雜度: O(n)

程式碼

#include <iostream>
using namespace std;
int main() {
	int m, xs[100], ys[100], counts = 0;
	cin >> m >> xs[0] >> ys[0] >> xs[1] >> ys[1];
	for (int i = 2; i < m; ++i) {
		cin >> xs[i] >> ys[i];
		for (int j = 0; j < i; ++j){
			int yis=ys[i]-ys[j],xis=xs[i]-xs[j];
			for (int k = j + 1; k < i; ++k)
				if ((yis) * (xs[i] - xs[k]) != (ys[i] - ys[k]) * (xis))
					++counts;
		}
	}
	cout << counts << '\n';
}

Discussion