HD 1466 計算直線的交點數 解題報告

計算直線的交點數

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7262 Accepted Submission(s): 3227


Problem Description
平面上有n條直線,且無三線共點,問這些直線能有多少種不同交點數。
比如,如果n=2,則可能的交點數量爲0(平行)或者1(不平行)。

Input
輸入數據包含多個測試實例,每個測試實例佔一行,每行包含一個正整數n(n<=20),n表示直線的數量.

Output
每個測試實例對應一行輸出,從小到大列出所有相交方案,其中每個數爲可能的交點數,每行的整數之間用一個空格隔開。

Sample Input
2 3

Sample Output
0 1 0 2 3
解題分析:n=1 時無交點;
n=2 時有0個交點,或者有1個交點;
n=3 時無交點,或者有2個交點,或者有3個交點;
n=4 時有任意一條直線與其餘1條直線平行則有 (4-2)*2+2條直線交點數,或者任意一條直線與其餘2條直線平行則有 (4-3)*1+1條直線交點數,或者任意一條直線與其餘任意一條直線都不平行則有 4*(4-1)/2個交點;
……………………
由此可得動態轉移方程式爲 (m-r)*r+r條自由直線的交點數 r取值區間(0,m-1)
解題代碼:
#include <stdio.h>
#include <stdlib.h>

int a[21][191];//a[i][j]==1表示i條邊會有j個交點
int main()
{
    int i,j,k,n;
    /**最開始將數組清爲0**/
    for(i=0; i<=20; i++)
        for(j=0; j<=190; j++)
            a[i][j]=0;
    /**不管你有幾條線,都有可能是0個交點**/
    for(i=1; i<=20; i++)
        a[i][0]=1;
    /**遞推的過程i表示邊數,j表示自由的邊數,k表示有多少交點數,利用動態轉移方程(i-j)*j+j條直線可能的交點數**/
    for(i=2; i<=20; i++)
        for(j=0; j<i; j++)
            for(k=0; k<=190; k++)
                if(a[j][k]==1)
                    a[i][(i-j)*j+k]=1;

    while(scanf("%d",&n)!=EOF)
    {
        printf("0");//這裏提前輸出一個0,是爲了控制格式符合要求
        for(i=1; i<=n*(n-1)/2; i++)
            if(a[n][i]!=0)
                printf(" %d",i);
        printf("\n");
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章