# Sorting# Brute Force

b557 - 直角三角形

🔗 前往 ZeroJudge 原題

題目描述

題目給定一組木棒的長度,要求計算可以組成幾種直角三角形。

解題思路

此題的解題思路是先將木棒長度排序,然後使用三重迴圈枚舉所有可能的組合,檢查是否滿足勾股定理。排序可以避免重複計算。具體來說,對於每三個木棒長度 a, b, c (其中 a < b < c),如果 a*a + b*b == c*c,則表示可以組成一個直角三角形,計數器加一。

複雜度分析

  • 時間複雜度: O(n^3) 因為使用了三重迴圈,其中 n 是木棒的數量。排序的時間複雜度為 O(n log n),但相較於 O(n^3) 可以忽略。
  • 空間複雜度: O(n) 主要用於儲存木棒長度的陣列。

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
	ios::sync_with_stdio(false);
    cin.tie(NULL);
	int a,i,c;
	cin >> a;
	while(cin >> a){
		int t[a];
		for(i=0;i<a;i++)
			cin >> t[i];
		c=0;
		sort(t,t+a);
		for(int i=0;i<a;i++){
			for(int j=i+1;j<a;j++){
				for(int k=j+1;k<a;k++){
					if(t[i]*t[i]+t[j]*t[j]==t[k]*t[k])
						c++;
				}
			}
		}
		cout << c << endl;
	}
}

Discussion