HDU 1466 计算直线的交点数

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 0条
n=2 0,1条
n=3 0,2,3条
n=4 0,3,4,5,6条
n条线最多的交点数为n*(n-1)/2;
假设n条线里有i条线平行,那么n条线的交点数为i*(n-i)+j,j表示剩余的(n-i)条线可能的交点数。dp[i][j]=1表示i条线可有j个交点。
 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 21
 4 #define M N*(N-1)/2
 5 int dp[N][M];
 6 int main()
 7 {
 8     int i, j, n, k;
 9     dp[0][0] = 1;dp[1][0] = 1;
10     for(n = 2; n <= N; n++){
11         for(i = 0; i < n; i++){
12             for(j = 0; j <= i * (i-1) / 2; j++){
13                 if(dp[i][j] == 1){
14                     dp[n][i * (n-i) + j] = 1;
15                 }
16             }
17         }
18     }
19     while(~scanf("%d", &n))
20     {
21         printf("0");
22         for(i=1; i<=n*(n-1)/2; i++){
23             if(dp[n][i] == 1){
24                 printf(" %d", i);
25             }
26         }
27         printf("\n");
28     }
29     return 0;
30 }
View Code

 

posted @ 2014-03-25 19:23  SStep  阅读(170)  评论(0编辑  收藏  举报