問題描述:
平面上有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;
}
}