15HD OJ 計算直線的交點數

2021-07-03 02:14:40 字數 1481 閱讀 8351

*/平面上有n條直線,且無三線共點,問這些直線能有多少種不同交點數。

比如,如果n=2,則可能的交點數量為0(平行)或者1(不平行)。

輸入資料報含多個測試例項,每個測試例項佔一行,每行包含乙個正整數n(n<=20),n表示直線的數量.

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

2

3

0 1

0 2 3

解析:容易列舉出n=1,2,3的情況:

00,1

0,2,3

如果已知

1、第四條與其餘直線全部平行 => 無交點;

2、第四條與其中兩條平行,交點數為(n-1)*1+0=3;

3、第四條與其中一條平行,這兩條平行直線和另外兩點直線的交點數為(n-2)*2=4,而另外兩條直線既可能平行也可能相交,因此可能交點數為:

(n-2)*2+0=4    或者         (n-2)*2+1=5    

4、第四條直線不與任何一條直線平行,交點數為:

(n-3)*3+0=3   或者 (n-3)*3+2=5    或者 (n-3)*3+3=6即n=4時,有0個,3個,4個,5個,6個不同交點數。

從上述n=4的分析過程中,我們發現:

m條直線的交點方案數

=(m-r)條平行線與r條直線交叉的交點數

+ r條直線本身的交點方案

=(m-r)*r+r條之間本身的交點方案數(1<=r<=m)

**:超限**:

#include #include using namespace std;

int main()

{ int a[21][200],i,n;

memset(a,0,sizeof(a));

for(i=0; i<21; ++i)

a[i][0]=0; //所有直線都平行,即0個交點

for(n=2; n<21; ++n)

for(i=1; i>n)

{for(i=0; i<=n*(n-1)/2; ++i)

{if(a[n][i])

cout <

ac**:

#includeusing namespace std;

int main()

{ int i,n,s[21][200],j,k;

for(i=1; i<=20; i++)

for(j=0; j<=200; j++)

s[i][j]=0;

s[0][0]=1;

s[1][0]=1;

s[2][0]=1;

s[2][1]=1;

for(i=3; i<=20; i++)

for(j=0; j>n)

{cout<<"0";

for(i=1; i<=(n-1)*n/2; i++)

if(s[n][i]==1)

cout<<" "<

計算直線的交點數

time limit 1 sec memory limit 64 mb submit 820 solved 518 平面上有n條直線,且無三線共點,問這些直線能有多少種不同交點數。比如,如果n 2,則可能的交點數量為0 平行 或者1 不平行 輸入資料報含多個測試例項,每個測試例項佔一行,每行包含乙個...

OJ 計算直線的交點數

平面上有n條直線,且無三線共點,問這些直線能有多少種不同交點數。比如,如果n 2,則可能的交點數量為0 平行 或者1 不平行 輸入資料報含多個測試例項,每個測試例項佔一行,每行包含乙個正整數n n 20 n表示直線的數量。每個測試例項對應一行輸出,從小到大列出所有相交方案,其中每個數為可能的交點數,...

DP 計算直線的交點數

描述 平面上有n條直線,且無三線共點,問這些直線能有多少種不同交點數。比如,如果n 2,則可能的交點數量為0 平行 或者1 不平行 輸入輸入資料報含多個測試例項,每個測試例項佔一行,每行包含乙個正整數n n 20 n表示直線的數量.輸出每個測試例項對應一行輸出,從小到大列出所有相交方案,其中每個數為...