杭电 1466 计算直线的交点数

Description

平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。 
比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。

Input

输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n<=20),n表示直线的数量. 

Output

每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。

Sample Input

2
3

Sample Output

0 1
0 2 3

1条线:0
2条线:0 1
3条线:0 2 3
4条线:0 3 4 5 6 
……
可以把直线分成两组,第一组是相互平行的直线,第二组是自由直线,自由直线不与平行直线平行;
设直线总是为N,设第一组有i条直线,则第二组N-i有条直线。
以4条线来分析:
1、当i=4,N-i=0时,交点数:0
2、当i=3,N-i=1时,交点数:3条平行线与1条自由线的交点个数+1条自由线能形成的交点个数,即3+0=3
3、当i=2,N-i=2时,交点数:2*2+{0,1}={4,5}
4、当i=1,N-i=3时,交点数:1*3+{0,2,3}={3,5,6}
 每个自由直线与每个平行直线都有一个交点,j自由直线与i平行直线的交点数为j*i,所以n条直线的交点数等于自由直线与平行直线的交点加上自由直线内部形成的交点 
 
 1 #include<cstdio>
 2 #include<string.h>
 3 int main()
 4 {
 5     int n,i,,k,free;
 6     int d[25][200];                            //d[i][j]表示i条直线有j个交点 
 7     memset(d,0,sizeof(d));
 8     for(i = 1 ; i < 21 ; i++)
 9     {
10         d[i][0]=1;                            //交点为0总是存在的 
11         for(free = 0 ; free <= i ; free++)    //free代表自由直线的数量 
12         {
13             for(k = 0 ; k < free*(free+1)/2 ; k++)
14             {
15                 if(d[free][k] == 1)        
16                 {
17                     d[i][free*(i-free)+k]=1;//free*(i-free)+k表示i条直线free条自由直线的交点数(k为自由直线的交点数) 
18                 }
19             }
20         }
21     }
22     while(scanf("%d",&n)!=EOF)
23     {
24         for(i = 0 ; i <= n*(n-1)/2 ; i++)
25         {
26             if(i == 0)
27                 printf("0");
28             else
29             {
30                 if(d[n][i])
31                 {
32                     printf(" %d",i);
33                 }
34             }
35         }
36         printf("\n");
37     }
38     return 0;
39 }

 

posted @ 2016-08-09 17:34  野小子&  阅读(277)  评论(0编辑  收藏  举报