計算直線的交點方案數

問題描述:
平面上有n條直線,且無三線共點,問這些直線能有多少種不同交點數。
輸入:n(n<=20)
輸出:每個測試實例對應一行輸出,從小到大列出所有相交方案,其中每個數爲可能的交點數。
樣例輸入
4
樣例輸出
0 3 4 5 6
【分析】
我們知道:

n條直線互不平行且無三線共點的最多交點數max=1+2+……(n-1)=n(n-1)/2,

但本題不這麼簡單,因爲問題問的是:這些直線有多少種不同的交點數?
容易列舉出N=1,2,3的情況:
0
0,1
0,2,3
我們來分析N=4的情況:

4條平行 第四條與其餘直線全部平行 => 無交點;
3條平行 第四條與其中兩條平行,交點數爲(n-1)*1+0=3;
2條平行 第四條與其中一條平行,這兩條平行直線和另外兩點直線的交點數爲(n-2)*2=4,而另外兩條直線既可能平行也可能相交,因此可能交點數爲:(n-2)*2+0=4 或者 (n-2)*2+1=5
0條平行 第四條直線不與任何一條直線平行,交點數爲:
(n-3)*3+0=3 或者 (n-3)*3+2=5 或者 (n-3)*3+3=6

即n=4時,有0個,3個,4個,5個,6個不同交點數。

假設一共有n=a+b條直線
(即n條直線分成2組,分別爲a條和b條)
則總的交點數= a內的交點數
+b內的交點數
+a,b之間的交點數

我們將n條直線分爲兩部分,平行的直線數目r,和不平行的數目n-r;
分析可以知道r的取值是0<=r<=n;

n條直線相交的方案數
=(n-r)條平行線的交點方案(爲0)+r條直線本身的交點方案+(n-r)條平行線與r條直線交叉的交點數方案
= r條直線本身的交點方案 +(n-r)條平行線與r條直線交叉的交點數方案。
=(m-r)*r+r條之間本身的交點方案數(0<=r<=n)

#include<iostream>
using namespace std;
int dp[21][200];//dp[i][j]=1表示存在i條直線交點方案數爲j; 
int main()
{
    for(int i=1;i<=20;i++)
    {
        dp[i][0]=1;
    }


    for(int i=2;i<=20;i++)
    {
        for(int j=0;j<=i;j++)
        {
            for(int k=0;k<190;k++)
            {
                if(dp[j][k]==1)
                {
                    dp[i][(i-j)*j+k]=1;
                }
            }   
        }   
    }

    for(int i=1;i<=6;i++)
    {
        for(int j=0;j<=190;j++)
        {
            if(dp[i][j]==1)
            {
                cout<<j<<"  ";
            }
        }
        cout<<endl;
    }
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章