1. 程式人生 > 其它 >N-37.愛麗絲拼三角形

N-37.愛麗絲拼三角形

題目背景:

愛麗絲想要學幾何,可是她對數學是一臉懵逼。這不,某天幾何老師在黑板上出了這樣一道題:給定一個長度為n的木棍,將其切割成長度為正整數a,b,c(a<=b<=c)的三段,問有多少種切割方案,使得切下來的三段可以拼成一個三角形,等腰三角形以及直角三角形,同時,三角形的三條邊均要嚴格處於[l,r]這個區間。幾何老師叫了正在做夢的愛麗絲上來回答這道題,這時她想要請你編寫一個程式解決這個問題,讓她免受老師的批評。

輸入格式:

第一行一個整數T,代表資料組數。

此後T行每行三個正整數n,l,r,表示木棍的長度為n,三角形三條邊均位於[l,r]這個區間。

輸出格式:

T行,每行三個整數t1,t2,t3,分別表示滿足條件的三角形的個數,等腰三角形的個數,直角三角形的個數。輸出以換行符結尾。

樣例輸入1:

1

10 3 7

樣例輸出1:

1 1 0

資料範圍:

1<=T<=10, 1<=n<=300, 1<=l,r<=100, r<=n

資料量不大,我們直接二重迴圈遍歷兩條邊,進行判斷即可。
為了不重複定義,我們設 i <= j <= n-i-j

#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include <math.h> 
int t, n, l, r;  
void solve () {
	int cnt = 0, cnt1 = 0, cnt2 = 0;  // 分別表示三角形個數,等腰三角形個數,直角三角形個數
        int n, l, r;  
        scanf("%d%d%d",&n,&l,&r);  
        for (int i = l; i <= r; i++) {  // 第一條邊
            for (int j = i; j <= r; j++){  // 第二條邊
                int k = n - i - j;  // 第三條邊
                if (k > r || k < j || i + j <= k) continue; // k的範圍限制和不能構成三角形的情況   
                cnt++;  
                if (i == j || i == k || j == k) cnt1++;  // 等腰
                if( i * i + j * j == k * k) cnt2++;  // 直角
            }  
        }  
    printf("%d %d %d\n",cnt,cnt1,cnt2);   
    return;
}
int main () {   
    scanf("%d",&t);  
    while (t--) solve ();
return 0;}